레이어드 아키텍처란?
소프트웨어 시스템을 여러 개의 레이어로 분리하여 구축하는 아키텍처 패턴이다.
각 레이어는 특정한 역할과 책임을 갖고 있으며, 서로 상위 레이어에서 하위 레이어로만 직접적으로 의존한다.
Spring MVC는 Model-View-Controller의 구조로
View와 Controller는 프레젠테이션 계층에 속하며
Model은 비즈니스와 데이터 접근 계층 영역으로 구분 할 수 있다.
프레젠테이션 레이어
사용자와의 상호작용을 담당한다.
UI또는 API를 제공한다. 비즈니스 로직은 포함하지 않고, 비즈니스 계층으로 요청을 위임하여 반환받은 결과를 응답하는 역할만 수행한다.
스프링 MVC: 스프링은 웹 어플리케이션의 프레젠테이션 레이어를 구현하기 위해 스프링 MVC를 제공한다.
DispatcherServlet, 컨트롤러, 뷰, 모델이 포함된다.
비즈니스 레이어
실제 비즈니스 로직을 수행하는 컴포넌트로, 트랜잭션 및 실질적인 비즈니스 로직 수행을 담당한다.
비즈니스 계층에는 서비스를 배치하여 엔티티와 같은 도메인 객체와 함꼐 비즈니스 로직을 처리한다.
스프링은 서비스 레이어를 구현하기 위해 스프링 빈(Bean)을 사용한다.
비즈니스 로직을 처리하는 서비스 클래스는 @Service 어노테이션을 통해 빈으로 등록하여 관리할 수 있다.
데이터 접근 레이어
데이터 베이스에 직접 접근하는 모든 작업을 수행한다.
DAO(Data Access Object)를 배치하여 도메인을 관리한다.
<Spring MVC 기본 동작 흐름>
1. DispatcherServlet
애플리케이션으로 들어오는 모든 Request를 받는 부분. Request를 실제로 처리할 Controller에게 전달하고 그 결과값을 받아서 View에 전달하여 적절한 응답을 생성할 수 있도록 흐름을 제어한다.
2. HandlerMapping
Request URL에 따라 각각 어떤 Controller가 실제로 처리할 것인지 찾아주는 역할이다.
3. Controller
Request를 직접 처리한 후, 필요한 비즈니스 로직을 수행하여 모델을 업데이트 한다.
HandlerAdapter는 DispatcherServlet의 처리 요청을 변환해서 컨트롤러에 전달한다.
4. ModelAndView
Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체이다.
5. ViewResolver
DispatcherServlet은 ViewResolver을 사용하여 View를 선택하고, 모델을 전달한다.
6. View
View는 모델의 데이터를 사용해서 클라이언트에게 응답을 생성한다.
제어의 역전(Inversion of Control)
객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 펀하게 할 수 있게 한다.
스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖는다.
의존성 주입(Dependency Injection)
스프링은 의존성 주입을 통해 객체 간의 결합도를 낮춘다.
객체를 직접 생성하는 게 아니라, 외부에서 생성한 후 주입 시켜주는 방식이다.
직접 객체를 생성했을 경우
스프링에서는 객체를 Bean이라고 부르며, 프로젝트가 실행될 때 사용자가 Bean으로 관리하는 객체들의 생성과 수멸에 관련된 작업을 자동적으로 수행해주는데 객체가 생성되는 곳을 스프링에서는 Bean 컨테이너라고 부른다.
기존: 인스턴스 생성할때 new 붙여서 새로 생성
스프링: 컨테이너가 싱글톤 패턴을 사용해 Bean으로 객체 관리
애노테이션 기반 자바 코드 설정
Bean 등록
@Configuration:
1개 이상의 빈을 제공하는 클래스의 경우 반드시 명시해야 한다. @Bean을 붙인 메서드들을 Bean으로 등록할 수 있는 어노테이션이다.
@Bean: 클래스를 빈으로 등록할 때 사용한다.
@Component: 컴포넌트 스캔을 통해서 감지되어 자동으로 Bean이 등록될 후보 클래스를 명시한다. Method가 아닌 Class 단위에 붙인다.
@RestController: 컨트롤러를 명시하는 어노테이션이다. @Controller에 @ResponseBody가 추가 된 것이다.
요청/응답
@RequestMapping: 요청에 대한 URL을 매핑하는 어노테이션이다.
Class 단위에 사용면 하위 메서드에 모두 적용되고, 메서드에 적용되면 해당 메서드에서 지정한 방식으로 URL을 처리한다. HTTP 메서드를 지정하면 해당 메서드에 대한 응답만을 받을 수 있다.
@RequestMapping("/member") // 이 클래스는 /member로 들어오는 요청을 모두 처리한다.
@RestController
public class MemberController {
@GetMapping("/get") // 실제 url은 /member/get
public String member(){
return "멤버";
}
@RequestParam:
컨트롤러에서 요청을 받을 때 사용된다.
URL에 전달되는 파라미터를 메서드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있다.
Json형식의 Body를 java 객체로 변환시킨다.
@GetMapping("/member")
public void hello(@RequestParam("name") String name, @RequestParam("age") int age){
...
}
@RequestBody:
Body에 전달되는 데이터를 메서드의 인자와 매칭시켜 데이터를 받아서 처리할 수 있게 한다.
return할떄 json, xml과 같은 데이터를 리턴한다.
@ResponseBody:
자바 객체를 HTTP 요청의 바디 내용으로 매핑하여 클라이언트로 전송한다.
이 어노테이션을 사용하면 http 요청 body를 자바 객체로 전달받을 수 있다.
@Controller // Controller 역할
@RequestMapping("/member") // /member로 들어오는 요청을 모두 처리한다.
public class MemberController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getMember(@RequestParam String nickname, @RequestParam(name="old") String age {
...
}
@RequestBody / @ResponseBody
클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
서버에서 클라이언트로 응답 데이터를 전송하기 위해, @ResponseBody 어노테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.
'spring & java' 카테고리의 다른 글
| JPA 영속성 컨텍스트 / 영속성 전이 (0) | 2024.08.13 |
|---|---|
| HTTP method (2) | 2024.08.11 |
| 싱글톤 패턴 기초 (1) | 2024.02.19 |
| [java] Map 사용방법 (0) | 2024.01.25 |
| Optional <t> 이란? (1) | 2024.01.06 |