[공부 노트] #2

2 minute read

Q1. Enum

백기선님과 함께하는 자바 스터디 계획 중에 Enum파트가 있기 때문에, 추후 공부하기로 했다.

Q2. Lombok

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder

영상 강의를 따라하는 도중에 클래스 상단에 같은 어노테이션을 사용하는 과정이 반복되었다. 여기에 다른 종류의 어노테이션까지 붙어 길어진 모습을 보고있자면, 정확하게는 모르지만 분명 잘못되어가고 있음을 느낄 수 있었다. @Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 포함하는 어노테이션이다. 많은 어노테이션을 포함하여 굉장히 편리할 수 있지만, 그만큼 부작용의 가능성이 있어 사용이 지양된다고 한다.
우선 무분별한 Setter의 남발이 문제가 된다. Setter는 그 의도가 분명하지 않은 메소드이고, 객체를 언제든지 변경할 수 있는 상태가 되어 일관성을 해치는 요소로 작용할 수 있다. 특히 변경 불가능한 멤버 변수에 Setter메소드를 설정하게 되는 실수가 발생할 수 있다.
그리고 @ToString 어노테이션은 객체가 서로 상호참조를 하고 있을 때, 호출이 무한 반복되는 오류가 발생할 수 있다. 이 때,

@ToString(exclude = "참조하는 객체명")

위와 같이 특정 멤버 변수에 대해서 ToString을 적용시키지 않을 수 있다.
@Builder 어노테이션 같은 경우는 정말 편리하다고 생각했는데, 클래스 위에 사용할 경우 @AllArgsConstructor 어노테이션을 붙인 효과를 발생시켜 모든 멤버 필드를 매개 변수로 받는 생성자를 만든다. JPA로 객체를 정의하다보면 id 혹은 createdAt과 같은 객체 생성시 받지 말아야할 멤버 변수가 존재하기 마련이다. 때문에 클래스 위에 선언하기 보다는, 적당한 생성자를 정의하고 그 위에 어노테이션을 붙이는 것이 좋아보인다.

Q3. Pageable

    @GetMapping("")
    public Header<List<UserApiResponse>> search(@PageableDefault(sort="id", direction = Sort.Direction.ASC, size = 15) Pageable pageable){
        log.info("{}",pageable);
        return userApiLogicService.search(pageable);
    }

뜬금없는 pageable이라는 개념의 등장이 매우 생소하게 느껴졌다. pageable 인터페이스는 paging 하기 위한 파라미터들을 담은 객체에 접근하기 위한 역할을 한다. 이 매개변수를 통해 paging 하기 위한 정보를 담은 객체가 들어오게 되고 이것을 통해 자동적으로 paging에 필요한 데이터를 처리하여 반환하게 된다. @PageableDefault 어노테이션으로 paging의 기본 옵션을 설정할 수 있다.

Q4. @RestController vs @Cotroller

두 어노테이션의 가장 큰 차이점은 HTTP Response Body가 생성되는 방식이다. 전통적인 MVC패턴에서 컨트롤러의 역할은 View를 반환하는 것이다.

MVC Pattern

하지만 때로는 데이터를 반환해야하는데, 다음 이미지와 같이 @ResponseBody 어노테이션을 통해서 Client에 Json 형태로 데이터를 반환하기도 한다. @ResponseBody는 메소드 상단 또는 리턴 타입 앞에 추가하여주면 된다.

MVC Pattern_2

@RestController는 @Cotroller + @Response Body와 같으며, 용도는 역시 Json 형태로 데이터를 반환하는 것이다. @Response Body 어노테이션을 추가할 필요 없이 컨트롤러 클래스의 각 메소드마다 기본으로 작동된다.

MVC Pattern_3

결론적으로 @RestController의 등장은 MVC패턴에서 View의 역할을 프론트엔드가 맡고, Controller는 클라이언트에 데이터를 반환해주는 것이 주된 역할이 되어버린 것이 원인이 된 것이라고 이해했다.

printf(“Hello 2021!”);

스프링 강의를 완강하였다. 아무래도 따라서 작성하는 것이 전부인 초급 강의였기에 빠르게 끝낼 수 있었고, 그 과정 속에서 배움의 부족함을 느낄 수 있었다. 그리고 우연히 백기선님께서 진행하시는 온라인 자바 스터디에 참여하게되어 자바를 제대로 다지고 갈 기회로 만들고자 한다. 다만 스프링이라는 프레임워크를 부딪히며 사용해볼 기회를 더 열심히 찾아봐야겠다. 생각보다 개발 공모전이 없었는데, 아직 활발하게 진행되는 시기가 아닌것 같다.

참고문헌 https://mangkyu.tistory.com/49

Leave a comment