1. 주석처리된건 필요한게 아니라면 commit시에는 삭제하도록하자.
2. Rest ful한 설계를 위해서 signup은 예외적인줄 알았지만 users라는 Post요청으로는 회원가입말고는 없기때문에
POST : /users 로 수정
3. @AllArgsConstructor 모든 필드가 사용된다면 어노테이션을 통해 코드를 줄이자 리펙토링시에 잘 확인하자
추가적으로 롬복이 제공하는 어노테이션을 잘 확인하도록 하자
4. @NoArgsConstructor 를 왜 사용했는가?
사용하면서 json에서 이제 post요청시에 dto를 json에서 자바코드로 역직렬화 시에 오류가 생겨서 사용했습니다.
해결하는 방법이 우연히 Noargs가 습관적으로 사용해서 해결이되었지만 해결방법중추가적으로는 Jsonproperty를 사용하는방법도있습니다 그래서 정리했습니다.
직렬화와 역직렬화란?
직렬화
- 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
역직렬화
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 부릅니다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
ObjectMapper 란 ?
ObjectMapper는 기본 POJO(Plan Old Java Obejcts) 또는 범용 Json 트리 모델 (JsonNode)간에 Json을 읽고 쓰는 기능과 변환 수행을 위한 관련 기능을 제공한다.
Java 객체를 Json으로 직렬화하고, Json 문자열을 Java 객체로 역직렬화 할 때 사용한다.
1. Object -> String 문자열 : writeValueAsString
Car car = new Car("K5", "gray");
String text = mapper.writeValueAsString(car); //{"name":"K5","color":"gray"}
2. String 문자열 -> Object : readValue
Car carObject = mapper.readValue(text, Car.class); //Car{name='k5',color='gary'}
Jackson라이브러리 기본기능 : @JsonCreator
스프링에서 메시지컨버터가 자동으로 Jackson라이브러리를 통해 변환시켜주기만해서 잘몰랐던 오류입니다. 추가적으로 Jpa사용시에 Noargs에대한 습관으로인해 잘보지못했지만 테스트 코드작성시에 발견했던 오류입니다.
직렬화를 위해서는 인스턴스 변수에 대한 Getter메소드가 포함되거나 인스턴스 변수에 @JsonProperty가 명시되어야한다.
역질렬화를 위해서는 반드시 기본생성자가 필요하다
각 인스턴스 변수에 대한 Setter 메소드가 필수로 필요하진 않지만 존재한다면 그것을 활용한다.
만약 @JsonCreator를 이용해서 역직렬화 할 때 생성자나 팩토리를 수정할 수 있습니다.
그런데 이미 @AllArgsConstructor가 사용됬다면 Already라는 메시지를 출력해주면서 컴파일에러가 납니다. 선택적으로 해야할것같습니다. 그렇다면 결론은 역직렬화를 위해서는 Noargs생성자 + Allargs냐 vs Jsonproperty이냐 이문제인건가?
직접 실험해보았습니다.
@JsonCreator
public SignUpDto(@JsonProperty("id") String id, @JsonProperty("email") String email,
@JsonProperty("password") String password, @JsonProperty("name") String name,
@JsonProperty("phoneNumber") String phoneNumber, @JsonProperty("type") UserType type){
this.id = id;
this.email = email;
this.password = password;
this.name = name;
this.phoneNumber =phoneNumber;
this.type = type;
}
실험결과는 Noargs생성자 + Allargs생성자 vs JsonCreator 이렇게 되었습니다. 선택적으로 활용하거나
ObjectMapper를 커스텀해서 프로젝트에서 static하게 사용하는 방법들이 여러가지인것같습니다
5. enum가독성
enum보통 한줄에 하나씩 서주자!
6. 상수가 있다면 테스트코드에서도 동일하게 적용하기 위해 상수를 따로 static으로 빼서 사용하자
7. '존재'만 확인하는 쿼리는 TOP 1이 제일 성능이 좋습니다.
😍칭찬받았다 테스트코드는 더 열심히 작성해야겠다!!!
참고 : https://pyoungt.tistory.com/210, https://findmypiece.tistory.com/166, https://dhdl-it.tistory.com/m/50
'Delivery' 카테고리의 다른 글
Mybatis batch처리 성능과 트랜잭션 (0) | 2022.08.01 |
---|---|
테스트코드의 MockMvc utf-8 성능측정 (0) | 2022.07.19 |
Mybatis ${}, #{} 차이 (0) | 2022.07.17 |
코드리팩토링 - (CheckStyle, AccessLevel, Builder, final) (0) | 2022.07.13 |
Home-Delivery 개념 모델링 (0) | 2022.06.28 |