본문 바로가기
관리자

Programming-[Backend]

(420)
트랜잭션이란 1. 기본 개념 1. 개념 트랜잭션은 데이터베이스(Database, DB)에서 일어나는 작업의 최소 단위를 말한다. 만약 A가 B에게 10,000원을 이체한다면 DB에 있는 A의 계좌정보에서 10,000원을 빼줘야 하고, B의 계좌정보에는 10,000원을 더해주어야 한다. 이 과정을 차례대로 나누어 생각해보자. 1. A의 계좌 잔액을 확인한다. 2. A의 계좌에서 10,000원을 제한다. 3. B의 계좌 잔액을 확인한다. 4. B의 계좌에 10,000원을 더한다. 위 과정 중에 네트워크 또는 프로그램상의 문제가 발생하면, 예를 들어 2까지만 진행되고 3에서 에러가 나버린채로 DB에 정보가 반영된다면 문제가될 것이다. 따라서 4가지 과정을 한 가지의 최소 단위의 작업으로 묶어서 처리할 필요가 있는데, 이것이 트랜잭션의 개..
[TIL] DB save 테스트 Id값 증가, Auto Increment 값은 transaction에 포함되지 않음 현상 @DataJpaTest를 이용하여 Save 테스트를 하면, 자동으로 Rollback이 되므로 DB 상에 데이터가 들어가지 않는다. 하지만, 여러 번 테스트 후에 Rollback을 하지 않고 실제 데이터를 넣어 보면, 아래와 같이 id값이 증가되는 것을 볼 수 있다. 원인 이것은 Auto increment가 적용되는 id 값은 rollback 되지 않기 때문이다. 정확하게는 Auto increment 값은 transaction에 포함되지 않기 때문에 내부적으로 id값이 증가하므로 실제 save 시에 증가된 id값이 적용되는 것이다. 해결 이런 경우 id 값을 ALTER TABLE {테이블명} auto_increment = {원하는 id값} 을 입력하여 변경해줄 수 있다.(참조1) 추가 Rollback..
[TIL] Swagger 날짜 입력 : @DateTimeFormat- Controller의 파라미터 중 LocalDate 처리 Swagger에 날짜 입력을 하려고 하니, 타입 에러가 발생했다. 이럴 때는 Controller의 파라미터 오브젝트를 표기해주는 부분에 @DateTimeFormat을 붙여주어 날짜 타입의 포맷을 명시해주어야 한다. Controller에 데이터를 전달해주는 파라미터 오브젝트(PO) 파일 중 한 개의 필드 pattern 옵션으로 원하는 양식대로 포맷을 설정해주면, 아래와 같이 Swagger에서 정상적으로 날짜 타입을 입력할 수 있다. Swagger 화면 입력 만약 RequestBody로 처리해야되는 상황이면 @JsonFormat을 사용해야 한다. 자세한건 아래 링크. [TIL] @JsonFormat으로 @DateTimeFormat 대신 Date까지만 받기
[TIL] @NotNull, @NonNull, @NotEmpty, @NotBlank, required=true 컨트롤러 파라미터 필수값 처리 Controller 파라미터 필수값으로 표시하고, 처리하기 Controller에서 파라미터로 받아오는 값을 필수값으로 처리하고, 표시하고 싶다면 @NotNull과 @Schema(required=true, ...)를 사용하면 된다. required = true는 @Schema 어노테이션의 속성이므로 Swagger의 문서상에서 프론트 엔드쪽에 보여질 때 required로 표시를 하는 옵션이고, 실제 @NotNull은 해당 값이 파라미터로 들어오지 않으면 에러를 반환한다. 만약 에러 메시지를 지정하고 싶다면 @NotNull(message = " ... " ) 속성을 사용하면 된다. @NonNull, @NotEmpty, @NotBlank NonNull은 데이터값이 Null이면 안된다. Null이면 에러를 반환한..
[TIL] Controller 필드 중 LocalDate 처리하기, @DateTimeFormat, Swagger Controller의 파라미터의 필드 값 중 LocalDate 타입이 있을 때는, @DateTimeFormat 어노테이션을 추가해주어야 한다. 1 2 3 @Schema(description = "받아올 날짜", type = "LocalDate", example = "2021-04-28") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate parentsDay Colored by Color Scripter cs 그러면 아래와 같이 Swagger에서 지정해준 날짜 포맷으로 입력 시, 정상적으로 동작한다.
[TIL][에러] 스프링 Projections constructor, No constructor found for class 상황 QueryDsl을 이용해서 Entity 에서 전체 필드를 호출하는 것이 아니라, 특정 필드들만 호출하거나, 연관된 다른 Entity의 필드를 동시에 호출하고 싶다면 아래와 같이 Projections.constructor를 사용한다. Repository쪽 코드 1 2 3 4 5 6 7 8 9 10 jpaQueryFactory .select(Projections.constructor(XxxDto.class , Xxx1Entity.id.as("id") , Xxx1Entity.name.as("siteName") , Xxx2Entity.visitor ) ) .from(...) ... Colored by Color Scripter cs XxxDto쪽 코드 1 2 3 4 5 6 7 8 9 @Data @Build..
[TIL][TDD] 스프링 TDD 개발 방법론 개요 필요성 정확한 프로그램을 만들기 위해서 생각할 수 있는 최대한의 경우의 수를 테스트 해보는 것이 당연히 유리하다. 그리고 이러한 테스트를 하나의 기능별로 구분해서 진행해본다면, 개발자가 명확한 논리를 갖게 되고 테스트를 하는 것이 쉬워진다. 또한 새로운 기능이 추가되거나 수정사항이 생기더라도 어떤 테스트에서 문제가 생겼는지 정확히 알 수 있고 유지보수하기가 편함을 상식적으로 알 수 있다. 위 방법대로 수행하는 것이 일반적이다. 그러나 TDD는 Test Driven Development로, 비즈니스 로직 -> 테스트 케이스 -> 메서드(실제 코드) 순으로 작성한다. 즉 메서드를 검증하기 위한 수단으로 테스트 코드를 작성하는 것이 아니라, 테스트 코드를 통과할 수 있는 소스 코드(메서드)를 짜는 방식으로 작..
스프링 부트 : 기본 개념 1) Entity, Repository 개념 개인적인 정리와 기록을 위한 글이다. 혹시라도 참고해주시는 분들께서는 정확하지 않은 내용이 있을 수 있으니 유의해주시길 바란다. 자바 진영의 백엔드 개발을 아무런 지식없이 시작하게 되었다. 현업에서 몸으로 부딪히며 정신없이 배우는 단계이다. 한편으론 초보자의 입장에서 쓰는 글이기 때문에 이해가 쉽고 공감이 되지 않을까 생각된다. Spring Boot, Spring Data JPA, Maven, lombok을 활용하여 서버 사이드의 서비스를 만드는 과정 중에 배운 기본 개념이다. 사용한 IDE는 intelliJ 이다. 1. Entity(엔티티) 데이터베이스(Database, DB) 에 쓰일 필드와 여러 엔티티간 연관관계를 정의한다. 데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 ..