프로젝트, 엔티티 생성하기

김남형·2021년 3월 19일
0

프로젝트를 진행하면서 고민 했던 부분만!

저의 FullStack 여정은 모든 코드를 상세하게 다루지 않습니다.
프로젝트를 진행하면서 생각해보고 고려해봐야 했던 부분들에 대해서만 적습니다.
만약 프로젝트의 모든 코드가 궁금하시면 깃허브를 참고해주세요!!

Spring boot Gradle project 생성

Entity 생성하기

ChatMessage

  • 동시 입력의 경우 누구의 메시지를 먼저 보여주기 결정하기 위해 밀리세컨드로 저장

Chat

  • 채팅에 참여하고 있는 유저들의 아이디값만 json array로 저장하기

제작 중 이슈

1. ObjectMapper를 사용한 직렬화 / 역직렬화 문제

  • 무심코 @NoArgsConstructor를 사용하곤 했습니다. 하지만 이유를 모르고 사용하다보니 어노테이션을 잊을 때도 있고 때론 그냥 작동하기도 했습니다.

String valueAsString = objectMapper
    .writeValueAsString(new CreateChatRequest("42Chat", userList));

private static class CreateChatRequest {
    private String      name;
    private List<Long>  users = new ArrayList<>();
}

위의 함수를 딱 실행 시키면!! 아래와 같은 에러가 발생한다.

에러가 발생하는 이유는 private으로 되어있는 프로퍼티에 접근 할 수 없기 때문에 발생하는 에러입니다. 프라이빗인데 Getter가 없으니까 당연한거 아냐? 라고 생각있는데 맞습니다.
이제부터 ObjectMapper부터 차근차근 알아보도록 하겠습니다.

ObjectMapper란?

  • Jackson라이브러리에 포함되어있는 스프링의 기본 변환기로 Java Object ←→ JSON 파싱
  • 이를 통해 응답으로 반환 할때, @Requestbody로 받은 json문자열을 직렬/역직렬화

기본 생성자가 필요한 이유

  • reflection를 사용해서 런타임에 동적으로 객체를 생성하기 위해 기본 생성자가 필요
  • "다른 생성자가 있는데 굳이 왜 기본생성자가 필요할까?"
    정답은 reflection API가 생성자의 인자를 보지 않기 때문이라고 합니다.
  • 이제서야 DAO, DTO에 기본 생성자를 관습적으로 적던 것에 대해 알 수 있었습니다.

Key, Value는 어떻게 찾아서 매칭 시킬까?

영어를 못해서 구글 번역본으로 올렸는데 원문이 보고 싶다면 클릭 해주세요!

접근지정자에 따라 Getter, Setter는 어떻게?

결론

  • 실행 시점에 동적으로 reflection API를 통해 객체를 생성하기 위해 기본 생성자가 필요하다.
  • 필드에 접근하기 위해 Getter, Setter, 또는 퍼블릭이어야 한다.
  • Setter가 없어도 값을 초기화 할 수 있는 것은 reflection을 사용하기 때문이다.
profile
제빵사에서 개발자되기

0개의 댓글