국비교육

국비지원 73일차 (spring - 빈(bean)개념 , Controller,Service,Repository)

재밌는개발러 2023. 11. 7. 01:07

 ※스프링 빈(Spring Bean)이란?

1) Spring IoC 컨테이너 가 관리하는 자바 객체 라고 합니다.

2) Spring이 생성하고 관리하는 자바 객체를 Bean이라고 한다

 

*IoC 컨테이너란?

1) IoC(제어 반전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의믜한다.

즉, 프로그래머의 제어 권한을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다..
2) 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해 주는 컨테이너가 있는데,
그것이 바로 IoC 컨테이너(=스프링 컨테이너) 입니다.

 

※스프링은 어떻게 자바객체가 있다는 것을 인지할 수 있을까?

1) 스프링은 약속되어 있는 어노테이션이 붙어있는 클래스를 자동으로 인지한다. 아래에서 설명하는 어노테이션이 붙어있 다면, 스프링이 자동으로 인지할 수 있게 된다.
2) Bean Configuration File에 직접 Bean을 등록하면 스프링이 인지할 수 있게 된다. 

 

1번 예제) 어노테이션을 붙인 클래스

 

* @Component
스프링에서 관리하는 요소라는 의미를 주는 일반적인 어노테이션

 

-> 위와 같이  @Compenent처럼 단지 스프링에서 관리한다는 포괄적인 의미의 어노테이션보다는 해당클래스가 어떤 역할을 하는지에 대해 더 정확히 설명하는 것이다 좋다. 그래서 아래 그림에 나와있는 어노테이션들은 @Component의 의미보다 구체적으로, 각각이 특정한 용도를 설명한 어노테이션들이다. 이렇게 용도에 적합한 어노테이션을 활용하면 특정기능에 대해서는 더 수월하게 사용할 수 있게 된다.



위그림 중에 Controller, Service, Repository가 백엔드 영역에 속할 것이다.. 
각 계층에 해당하는 어노테이션과 계층이 하는 역할에 대해서 살펴보겠습니다.

 

※ @Controller

Spring MVC의 컨트롤러 역할을 하는 클래스를 표시하는 어노테이션
Controller의 역할 중 하나로는, View에 표시할 템플릿을 찾기 위한 String 같은 것들을 반환하는 것이 있다. 
컨트롤러의 역할은 이외에도 많다고 한다, (위설명은 기본적인 Spring MVC 컨트롤러가 하던 역할이다.) 

 

 

※ @RestController

어노테이션을 조합해서 새로운 어노테이션의 기능을 만들 수도 있다.
@RestController는 @Controller와 @ResponseBody를 함께 사용한 조합이다. 
따라서 @RestController에서는 @ResponseBody를 사용하지 않아도 코드는 정상적으로 동작한다.
@RestController는 @ResponseBody를 가지고 있기 때문이다. 

Return Value 중 @ResponseBody와 ResponseEntity의 차이점에 대해 공부해 보면, ResponseEntity는 반환되는 내용 이외에도 모든 상태 코드에 대한 정적 팩토리 메서드를 제공하고, 응답 본문과 함께 HTTP 상태 코드, 응답 헤더를 포함하기 때문에 @RestController에서도 추가적인 정보를 나타내고자 한다면 ResponseEntity의 형태로 반환해야 한다. 
무엇보다도 @RestController에서 @ResponseBody를 붙이는 것처럼 중복된 어노테이션을 붙이지 않고, 일관성을 가지고 코드를 작성하는 것이 중요하다.

 

※ @Service

서비스 역할을 하는 클래스를 표시하는 어노테이션
Controller는 들어온 요청을 처리하기 위해 Service를 호출하고, Service는 컨트롤러로부터 받은 정보를 자바 로직(비즈니스로직)을 처리하는 방식으로 가공해 Controller에 다시 넘겨주는 역할을 한다. 

 

※ Controller에서 Service를 통하지 않고 Repository로 곧바로 정보를 전달하면 안 되나?

Controller는 클라이언트와 맡닿아 있다. 클라이언트가 작성한 러프한 내용을 그대로 담고 있기 때문에, 이 정보를 바탕으로 Controller가 직접 DB에 접근해서 정보를 꺼내고, 저장하는 것은 위험하다.
따라서 정보 변동의 가능성이 있는 로직들은 Service 계층에서 처리하도록 하고, 이마저도 DB에서 꺼내온 원본이 아닌, DTO를 통해 만들어진 복사본을 사용해 DB의 안정성을 지키려는 것이다. 

-> 코드의 재사용성, 보안성에 이점이 있을 것이다.

 

※ @Repository

DAO 혹은 레포지토리 역할을 하는 클래스를 표시하는 어노테이션
DB나 파일 같은 외부 I/O에 접근하는 메서드들을 사용하기 위한 인터페이스임을 표시할 수 있고, 예외의 자동 변환 기능을 제공한다.

 

※ 기본 스프링의 흐름도 

-> @Mapper 쓰는 곳은 'mybatis' 

 

※ MyBatis : Object Mapping 기술

1) 자바에서 SQL Mapper를 지원해 주는 프레임워크

2) SQL문을 이용해서 RDB에 접근, 데이터를 객체화시켜줌

3) SQL을 직접 작성하여 쿼리 수행 결과를 객체와 매핑

4) 쿼리문을 xml로 분리 가능

5) 복잡한 쿼리문 작성 가능

6) 데이터 캐싱 기능으로 성능 향상

7) but 객체와 쿼리문 모두 관리해야 함, CRUD 메서드를 직접 다 구현해야 함.