[우아한테크코스] 4월 15일 TIL
오늘 배운 것
- 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 제공할 수 있음
도메인이 외부에 노출되면 도메인에 의존하는 것을 모두 변경해야 함