스프링 MVC 보충자료
ModelAndView
ModelAndView
는 Spring MVC에서 사용되는 클래스 중 하나로, 컨트롤러가 반환할 뷰(view)와 뷰에 전달할 데이터(model)를 동시에 다룰 수 있게 해줍니다. 이를 통해 하나의 객체로 뷰 이름과 모델 데이터를 함께 전달할 수 있습니다.
주요 구성 요소
1. Model (데이터)
뷰에 전달할 데이터를 저장합니다.
addObject(String attributeName, Object attributeValue)
메서드를 사용하여 데이터를 추가합니다.컨트롤러에서 설정한 모델 데이터는 뷰에서 접근 가능하게 됩니다.
2. View (뷰 이름)
응답을 렌더링할 뷰의 이름을 지정합니다.
Spring은 지정된 뷰 이름에 따라 적절한 뷰 리졸버(ViewResolver)를 통해 실제 뷰를 찾습니다.
ModelAndView
생성 및 사용 방법
ModelAndView
생성 및 사용 방법1. 기본 생성 및 설정
2. 생성자 사용
3. 데이터 추가
addObject
를 반복적으로 호출하여 여러 데이터를 추가할 수 있습니다.
ModelAndView
와 모델/뷰 개별 처리 비교
ModelAndView
와 모델/뷰 개별 처리 비교ModelAndView
는 모델과 뷰를 한 번에 처리할 수 있는 장점이 있지만, 각각을 개별적으로 처리할 수도 있습니다.
모델과 뷰를 분리한 경우
언제 ModelAndView
를 사용하나요?
ModelAndView
를 사용하나요?1. 뷰와 모델 데이터를 함께 반환할 필요가 있을 때
컨트롤러 메서드에서 뷰 이름과 데이터를 함께 처리해야 할 경우 적합합니다.
2. 유연한 데이터 관리가 필요할 때
특정 조건에 따라 다른 뷰를 반환하거나, 다양한 데이터를 한꺼번에 관리할 때 유용합니다.
ModelAndView
사용 시 주의점
ModelAndView
사용 시 주의점너무 많은 데이터를
ModelAndView
에 담으면 코드가 복잡해질 수 있습니다. 필요한 경우,Model
이나@ModelAttribute
를 사용하는 방법을 고려하세요.Spring Boot에서는 주로
Model
과 뷰 이름을 별도로 처리하는 방식이 더 선호됩니다.
간단한 예제
Controller
View (greeting.jsp
)
greeting.jsp
)위 예제는 /greet
요청 시 greeting.jsp
뷰에 name
데이터를 전달하여 렌더링합니다.
@Controller, @Repository, @Service 나누는 이유와 차이점
Spring Framework에서는 애플리케이션의 계층 구조에 따라 역할을 분리하기 위해 다양한 어노테이션을 제공합니다. @Controller
, @Repository
, @Service
는 각각 컨트롤러, 데이터 접근 계층, 서비스 계층에서 사용되며, 이러한 계층 분리는 코드의 가독성과 유지보수성을 높이는 데 큰 역할을 합니다.
1. 왜 나누는가?
역할 분리
계층화된 아키텍처를 통해 각 계층이 명확한 역할을 갖게 합니다.
각 계층이 서로 독립적으로 동작하도록 설계하면, 변경 사항이 발생했을 때 다른 계층에 미치는 영향을 최소화할 수 있습니다.
의존성 관리
Spring의 **DI(Dependency Injection)**를 활용하여 객체 간 의존성을 효과적으로 관리합니다.
역할에 따라 적절한 어노테이션을 사용하면 Spring이 자동으로 컴포넌트를 스캔하고 빈으로 등록합니다.
테스트 용이성
역할이 명확히 나뉘면 각 계층을 독립적으로 테스트할 수 있어, 유닛 테스트와 통합 테스트가 수월해집니다.
2. @Controller
정의
@Controller
는 Spring MVC에서 컨트롤러 역할을 담당하는 클래스에 사용됩니다. 주로 클라이언트의 요청을 처리하고 적절한 응답을 반환하는 데 사용됩니다.
특징
HTTP 요청을 처리하고, 뷰(View) 이름을 반환하거나 데이터를 JSON으로 직렬화합니다.
주로 UI 로직과 관련된 코드를 작성합니다.
주요 역할
클라이언트 요청 매핑
@RequestMapping
또는@GetMapping
,@PostMapping
등을 사용하여 특정 URL 요청과 메서드를 연결합니다.
모델 데이터 전달
Model
또는ModelAndView
를 통해 뷰에 데이터를 전달합니다.
REST API 처리
@RestController
와 함께 사용하면 JSON 데이터를 반환합니다.
예제
3. @Repository
정의
@Repository
는 데이터 접근 계층(DAO, Data Access Object)에서 사용됩니다. 주로 데이터베이스와의 상호작용을 담당하는 클래스에 붙입니다.
특징
데이터베이스 관련 예외를 Spring의 DataAccessException으로 변환합니다.
@Repository
가 선언된 클래스는 Spring이 자동으로 빈으로 등록합니다.
주요 역할
데이터 CRUD 작업 수행
데이터베이스와의 직접적인 상호작용 코드 작성.
트랜잭션 처리
데이터 접근 계층은 서비스 계층과 협력하여 트랜잭션을 처리합니다.
MyBatis, JPA, Hibernate와 같은 ORM 도구와 함께 사용.
예제
4. @Service
정의
@Service
는 비즈니스 로직을 담당하는 서비스 계층 클래스에 사용됩니다. 주로 컨트롤러와 데이터 접근 계층 사이에서 중재자 역할을 합니다.
특징
컨트롤러가 요청한 비즈니스 로직을 처리하고 결과를 반환합니다.
서비스 계층에서 트랜잭션을 처리하며,
@Transactional
어노테이션과 함께 사용됩니다.
주요 역할
비즈니스 로직 구현
컨트롤러에서 받은 요청을 처리하고 필요한 데이터를 데이터 계층에서 가져옵니다.
데이터 계층과의 상호작용
데이터를 조회하거나 저장하기 위해
@Repository
를 호출합니다.
재사용 가능한 로직 작성
여러 컨트롤러에서 호출 가능한 로직을 캡슐화합니다.
예제
5. 계층 간 관계
계층 구조
컨트롤러(@Controller): 사용자 요청 처리 및 응답 반환.
서비스(@Service): 비즈니스 로직 구현.
레포지토리(@Repository): 데이터베이스 상호작용.
계층 간 호출 흐름
클라이언트 요청이
@Controller
에 도달합니다.@Controller
는 요청 처리에 필요한 로직을@Service
에 위임합니다.@Service
는 필요한 데이터를 가져오기 위해@Repository
를 호출합니다.최종 결과가
@Controller
를 통해 클라이언트에게 반환됩니다.
예제 흐름
ResponseEntity
ResponseEntity
는 Spring Framework에서 HTTP 응답을 직접 구성할 수 있도록 제공하는 클래스입니다. HTTP 상태 코드, 헤더, 바디를 명시적으로 제어할 수 있어 RESTful API 개발 시 주로 사용됩니다.
1. ResponseEntity란?
Spring MVC에서 HTTP 응답을 표현하는 객체.
HTTP 상태 코드, 응답 헤더, 응답 본문(Body)을 포함.
ResponseEntity
를 사용하면 컨트롤러가 클라이언트에 대해 더 세밀한 응답을 반환할 수 있음.
주요 특징
유연한 HTTP 상태 코드 설정
응답 상태 코드를 명시적으로 설정 가능.
응답 헤더 추가
클라이언트에게 추가 정보를 전달할 수 있음.
응답 본문 반환
객체, 문자열, JSON 데이터 등 다양한 형식의 데이터를 반환 가능.
2. ResponseEntity의 주요 생성 방법
1. 정적 메서드를 사용한 생성
Spring은 ResponseEntity
객체를 쉽게 생성할 수 있도록 다양한 정적 메서드를 제공합니다.
예제: 상태 코드와 바디 설정
ResponseEntity.ok()
는 HTTP 200 상태 코드와 함께 응답 바디를 설정.
예제: 상태 코드만 설정
ResponseEntity.noContent()
는 HTTP 204 상태 코드를 반환하며 바디는 포함하지 않음.
예제: 응답 헤더 추가
2. 생성자를 사용한 ResponseEntity 생성
ResponseEntity
생성자를 통해 상태 코드, 헤더, 바디를 직접 설정할 수도 있습니다.
예제
HttpHeaders
를 사용해 헤더를 설정하고,HttpStatus.CREATED
를 통해 HTTP 201 상태 코드를 반환.
3. ResponseEntity를 사용한 REST API 구현
사용자 정의 객체 반환
사용자 정보를 조회한 후, 사용자가 없으면 HTTP 404 상태 코드를 반환.
사용자가 존재하면 HTTP 200 상태 코드와 함께 사용자 객체를 반환.
4. 주요 메서드와 활용
정적 메서드
ResponseEntity.ok(Object body)
: HTTP 200 상태 코드와 바디를 설정.ResponseEntity.status(HttpStatus status)
: 상태 코드를 설정.ResponseEntity.noContent()
: HTTP 204 상태 코드를 설정.ResponseEntity.badRequest()
: HTTP 400 상태 코드를 설정.
빌더 패턴
ResponseEntity
는 빌더 패턴을 지원하여, 연속적으로 메서드를 호출해 응답을 설정할 수 있습니다.
예제: 빌더 패턴 활용
5. 사용 시 장점
1. 세밀한 HTTP 응답 제어
상태 코드, 헤더, 바디를 명시적으로 제어할 수 있어 클라이언트 요구사항에 맞는 응답 작성이 가능.
2. RESTful API 개발에 적합
RESTful API는 상태 코드와 헤더를 명확히 전달하는 것이 중요하므로,
ResponseEntity
를 통해 이를 쉽게 구현 가능.
3. 코드 가독성 증가
ResponseEntity
를 활용하면 응답 처리를 명확히 표현할 수 있어 코드 가독성이 향상됨.
6. 사용 시 주의사항
응답 데이터의 직렬화
객체를 응답 본문에 포함할 경우, Jackson과 같은 JSON 직렬화 라이브러리를 사용해야 함.
헤더 설정
필요하지 않은 헤더를 추가하지 않도록 주의.
명시적인 상태 코드 반환
적절한 상태 코드를 사용해 클라이언트가 응답을 명확히 이해할 수 있도록 해야 함.
Last updated