Spring 서비스 구조
Last updated
Last updated
Client의 요청을 받아 Requestmapping을 수행하고, 응답을 전달한다.
해당 요청 url에 따라 적절한 view와 mapping
@Autowired Service
를 통해 service의 method를 이용한다.
적절한 DTO(ResponseEntity)를 Client에 반환한다.
@Controller : API와 View를 동시에 사용하는 경우에 사용(view를 return해주는게 주 목적)
@ResponseBody : API 서비스로 사용하는 경우
메소드에서 @ResponseBody 어노테이션을 사용하면 Spring은 반환 값을 변환하여 HTTP Response 에 자동으로 씁니다. Controller 클래스의 각 메소드에는 @ResponseBody 어노테이션이 있어야한다.
@RestController : @Controller + @ResponseBody
Method마다 @ResponseBody를 붙여주지 않아도 된다.
HTTP ResponseBody에 직접 쓰여짐
data(json, xml) return이 주목적이다.
@Controller 는 View Page를 반환하지만, @RestController는 객체(VO,DTO)를 반환하기만 하면, 객체데이터는 application/json 형식의 HTTP ResponseBody에 직접 작성되게 된다.
비지니스 로직을 처리한다.
@Autowired Repository
를 통해 repository의 method를 이용
@Service
실제로 DB에 접근하는 객체로, Service와 DB를 연결하는 고리의 역할을 한다.
SQL을 사용해 적절한 CRUD API를 제공한다.
JPA 대부분 기본적인 CRUD method 제공
@Repository
JPA를 사용하는 경우 @Repository 어노테이션을 추가하지 않아도 된다.
계층간 데이터 교환을 위한 객체(Java Beans)이다.
DB에서 데이터를 얻어 Service나 Controller등으로 보낼 때 사용하는 객체이다.
로직을 갖고 있지 않은 순수한 데이터 객체이며, getter/setter 메서드만을 갖는다.
Request와 Response용 DTO는 View를 위한 클래스
자주 변경이 필요하다
ModelMapper를 통해서 DTO에서 필요한 부분을 이용해 Entity로 만든다.
또한 Controller Layer에서 Response DTO로 Client에 전달한다.
실제로 데이터베이스 물리 테이블과 1:1 매핑되어 바인딩 되어있다.
View Layer와 DB Layer 역할을 철저하게 분리하기 위해서
테이블과 매핑되는 Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면 View와 통신하는 DTO 클래스(Request / Response 클래스)는 자주 변경되므로 분리
즉 DTO는 Domain Model을 복사한 형태로, 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent만을 위해서 사용