GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Spring

[ Spring ] 프레임워크, DI, Entity / DTO

Backcoder 2023. 1. 15. 14:43

[ 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에서 처리 해 줍니다.