Controller가 세분화 되는 것이 좋을까? 아니면 합치는 것이 좋을까?
- 너무 중복 코드가 많아지는 것 같다. 컨트롤러가 한개면 메서드 뽑아서 할텐데, 검증 로직을 밖으로 빼낼 수 있을까?
- pathvariable을 스프링 검증을 적용할 수 있는지 (애노테이션, 클래스 만들기 등을 통해서 알아보자)
- 혹은, 굳이 애노테이션이나 클래스를 만들지 않고 컨트롤러를 합치는게 좋을까?
- 현재 컨트롤러 - home, add, edit, delete 별로 세분화했는데, 굳이 이럴 필요가 있을까? 뭔가 세분화하면서 중복이 많아진 느낌이다.
⇒ 이 문제는 결국 edit, delete, read (uri를 공유함) controller를 통합하기로 하였다.
Controller 내에서 공통적으로 사용하는 메서드를 클래스로 추출하여 사용하는 것이 좋을까?
- 컨트롤러 내에서 중복으로 사용되는 로직을 메서드로 추출하였다.
- 이 로직은 id 검증 로직인데, 사용자가 없는 id 값을 요청하면 예외를 발생시키는 역할을 하는 로직이다.
- 이를 클래스로 추출하여 관리하는 것이 나을까? 고민해보자.
Velog는 글 그룹과 같은 기능인 시리즈를 구현해두었다.
글 자체에서는 시리즈를 설정할 수 없고, 등록 or 수정하기 버튼을 눌렀을 때 따로 설정 화면이 나온다. 이 때 시리즈를 설정해준다.
메모리 리포지토리로는 뭔가 한계에 다다른 것 같다. 구현 할 수는 있겠지만, 너무 어거지가 될 듯 하다. 시리즈 구현하기 전에 DB 연동이 우선일 것 같다.
⇒ 좀 더 수월한 진행을 위해서 MySQL DB 연동부터 하였다. Entity 등 애노테이션을 공부해가면서 해야할 것 같다.
AddForm, EditForm과 같은 Form 객체에만 setter를 적용하고 Domain 객체에는 setter를 빼고 생성자로만 구성해보자.
DB를 사용하기위해 좀 더 공부를 하게 되면서,
- Entity와 같은 영속성(변하지않는) 컨텍스트를 관리하기 위해서는 Setter를 지양하는 것이 좋다고 한다.
- DTO를 사용해서 데이터를 교환하고, Entity는 변하지 않도록 둬야 한다.
- DTO는 뷰와 컨트롤러 사이에서 데이터를 주고받을 때 활용성이 높다.
- 아마도, 내가 만든 Form 객체가 DB의 DTO 역할을 하고있는 듯 하다.
- 뷰 템플릿과 컨트롤러가 서로 데이터를 주고받을 땐 Setter의 활성화가 필수였다(Setter를 하지 않으면 thymeleaf 뷰 템플릿에서 객체를 null로 넘겨준다.)
- 즉, DTO는 getter, setter 메서드가 필수이고, 다음과 같은 역할을 한다.
- 뷰와 컨트롤러 사이에서 데이터를 주고받을 때 활용한다.
- 뷰 템플릿(주로 form 형식으로 보내진 데이터)에서 받아온 데이터를 setter 메서드로 받은 후, Entity에 데이터를 전달해주는 역할을 한다. → 이 때, Entity는 최대한 생성자를 이용하여 데이터를 받도록 한다.