[우아한테크코스] 4월 15일 TIL

1 minute read

오늘 배운 것

  1. spring

@RequestBody에 기본 생성자가 필요한 이유

spring 요청 과정
JSON 형변환을 담당하는 것은 Jackson2HttpMessageConverter이다.
@RequestBody로 json 데이터 수신 -> java object 변환: 이 일을 Jackson2HttpMessageConverter가 해주는 것이다.
이 converter는 ObjectMapper를 이용해 readValue라는 메서드를 통해 값을 읽어서 Object로 변환해준다.
이 readValue라는 메서드는 Request의 body가 null인지만 확인하고 아닌 경우 _readMapAndClose() 메서드를 호출하게 된다.
이 readMapAndClose는 JsonDeserializer를 찾고 역직렬화를 해서 Object를 반환해주는 일을 한다.
이 때 createUsingDefault가 호출된다. 이는 default 생성자를 이용해 객체를 만들어주겠다는 것이다. 기본생성자가 null이면, 없으면 안되는 이유이다.

하지만 기본생성자가 null이더라도 deserializeFromObjectUsingNonDefault를 호출해서 객체를 가져온다.
이 경우 delegateSerializer를 사용하게 되어있는데, 생성자 위임을 하지 않은 경우엔 사용할 수 없다.

따라서 기본생성자가 있거나,
Property 기반 클래스이거나,
생성자 위임인 경우라면 기본생성자가 없어도 된다.

따라서 POST용 DTO에서는 setter가 필요 없다.

하지만 GET 요청에서는 Query Parameter를 사용한다.
이때 WebDataBinde를 사용하기 때문에 Java Bean으로 setter를 통해 값을 할당해서 setter가 필요하다.

h2 database?

h2 데이터베이스는 ram에 의존하는 데이터베이스이다.
웹서버를 재부팅하면 기존의 데이터가 사라진다.

spring layer

client <-> controller <-response/request dto-> service <-domain dto-> dao <-> db

  • web layer: 사용자의 입력 처리, 응답 반환 (response, request) (ex) controller, jsp, exception handlers, view templates

  • service layer: api 공급, 트랜잭션의 경계, 응답
    service가 비즈니스 담당이기는 하지만 핵심 비즈니스 로직은 상태값을 가진 모델이 담당해야 한다.
    비즈니스 로직은 하나의 트랜잭션으로 동작한다.
    (ex) controller와 dao 중간영역

  • repository layer: db와 통신
    (ex) dao

  • dto: 계층 간 객체를 전달하고자 함
    도메인 == db table이라서 dto를 사용하지 않으면 외부에 db가 노출된다. dto 사용을 통해 더 쉽게 api 제공할 수 있음
    도메인이 외부에 노출되면 도메인에 의존하는 것을 모두 변경해야 함