[ Spring Framewrok ]
- 스프링에서는 MVC 패턴의 프레임워크를 정해두었습니다.
각자의 역할을 가지는 객체를 정해두었고, 이런 규칙을 잘 따르면 편리한 기능들을 제공해 줍니다.
@Controller 는 DB랑 클라 요청처리 받아서 연결해주는 역할,
@Service 단에서는 데이터 선처리 후처리 등 작업,
@DAO 는 데이터 관리
...
정해놓은 규칙 정도이지, 간단한 api라면 service 단 없이, Controller 단에서 데이터처리까지 해줄 수 있습니다.
하지만 규모가 조금만 커지면
Controller 단에서는 맵핑해주는 역할과 데이터 처리하는 역할이 뒤섞이고
다른 개발자가 봤을 때 가독성이 떨어지게 되겠죠.
폴더별로 파일을 정리하는 것 처럼
프레임워크가 정해놓은 규칙에 따라서 객체를 정리해서 사용하는 개념과 비슷한 듯 합니다.
하지만 이런 '규칙' 은 Spring 에 있어서 진지하게 적용되고 있습니다.
서비스 단과 DAO 단에서 각자 interface 를 만들어 사용하고,
Contoller / Service / DAO 각 역할을 지키며 사용됩니다.
[ Dependency Injection ]
- Spring 을 사용하기 전, 그냥 Java 에서는 객체를 개발자가 직접 생성하고 관리했습니다.
A동네 에서 만들어진 객체는 B동네에서 가져다 쓰였고,
B동네에서는 또 그걸 가져다 C 동네에서 쓰고...
그러다 보면 A, B, C 마을 사이에는 의존성(Dependency) 가 생겨납니다.
그러다 A 동네에서 만들어졌던 객체에 수정이 발생하면
개발자는 직접 B동네, C동네를 돌아다니며 손수 객체를 수정해주어야 했습니다.
Spring 을 사용하면, 객체를 Spring 에서 직접 생성하고 관리해 줍니다.
각 페이지별로 흩어져 있던 개발자가 직접 관리하던 객체를
Spring 이 컨테이너에 싹 모아다가 유통을 시켜주는 것이죠.
A 동네의 객체에 수정이 이루어지면
Spring 이 컨테이너에 담아둔 객체를 수정하고,
B, C 마을에서 받아쓰던 A 객체는 Spring 컨테이너에서 유통받은 것이기 때문에
자동적으로 B, C 마을에서도 수정된 A 객체를 받아 쓸 수 있습니다.
이제 개발자가 A 와 B 마을 C마을 사이에 Dependency 를 신경 쓸 필요가 없어졌습니다.
객체의 생성과 관리도 사실 상 이제 Spring 이 도맡아 해주고 있습니다. ( Dependency Injection - 의존성 주입 )
이제 객체에 대한 주도권(Control)이 개발자에서 => Spring으로 넘어가는 주객전도 현상이 발생한 것이죠.
( Inversion Of Control - 제어의 역전 )
Spring 이 객체를 관리하는 방법은 점점 더 편하게 발전되어 오고 있습니다.
1. xml
<bean id = > ...
2. Config.class
@Configuration ...
3. @어노테이션
@Component / @Repository / @Service ...
[ Entity / DTO ]
- Entity
: DB와 일치 된 객체
- Entity를 직접 DTO 역할로, 즉 데이터를 받아오고, 전달하는 그릇의 역할로 사용하게 되면
1. 효율
DB 해당 테이블의 모든 데이터를 다 가지고 있으므로,
필요하지 않은 모든 데이터를 다 움직여야 합니다. ( 보안적으로도 Bad )
클라이언트 단에서 필요로 되는 데이터만 뽑은 DTO를 사용하는게 효율이 좋습니다.
( 변수명을 바꿔서 보내달라던가 / date 양식 다르게 달라던가 )
2. JPA 문제
JPA 에서는 Entity 에서 어노테이션 등을 통해 직접 DB 에 테이블을 생성합니다.
즉, Entity 클래스는 말그대로 DB 그 자체가 되는 클래스이고,
이를 그릇 역할 정도로 사용했다가는 여러 문제가 발생할 수 있다고 합니다.
그릇역할의 DTO 를 따로 만들어 사용하는 것이 효율적으로나 / 안전적으로나 좋기 때문에,
실무에서는 하나의 Entity 에 대해 필요에 따른 여러 버전의 DTO 그릇들을 만들어 사용한다고 합니다.
postDTO / postResponseDTO ...
- 입력값 받는 DTO 는 DTO => Entity 로 만드는 과정
- 응답용 DTO 는 Entity => 응답용 DTO 로 만드는 과정
( toEntity() / toDTO 등의 메소드 처리 과정이 필요 )
- 사용자 입력을 받는건 DTO 니까 validation 은 DTO에서 처리 해 줍니다.
'Back to the Spring' 카테고리의 다른 글
JPA Paging 처리 (Page, Pageable) (2) | 2023.01.18 |
---|---|
[ Spring ] RestAPI 만능 객체 ResponseEntity<?> (0) | 2023.01.15 |
[Spring Security] Authentication Failure Handler 적용 (0) | 2022.12.24 |
[ Spring Security ] OAuth2 구글 / 네이버 로그인 (2) | 2022.12.23 |
[Spring Security] SecurityConfig, UserDetailsService, BCrypt, CSRF (0) | 2022.12.23 |