backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • ModelAndView
  • 주요 구성 요소
  • ModelAndView 생성 및 사용 방법
  • ModelAndView와 모델/뷰 개별 처리 비교
  • 언제 ModelAndView를 사용하나요?
  • ModelAndView 사용 시 주의점
  • 간단한 예제
  • @Controller, @Repository, @Service 나누는 이유와 차이점
  • 1. 왜 나누는가?
  • 2. @Controller
  • 3. @Repository
  • 4. @Service
  • 5. 계층 간 관계
  • ResponseEntity
  • 1. ResponseEntity란?
  • 2. ResponseEntity의 주요 생성 방법
  • 3. ResponseEntity를 사용한 REST API 구현
  • 4. 주요 메서드와 활용
  • 5. 사용 시 장점
  • 6. 사용 시 주의사항
  1. 스프링
  2. Spring Boot
  3. 10 스프링 MVC

스프링 MVC 보충자료

ModelAndView

ModelAndView는 Spring MVC에서 사용되는 클래스 중 하나로, 컨트롤러가 반환할 뷰(view)와 뷰에 전달할 데이터(model)를 동시에 다룰 수 있게 해줍니다. 이를 통해 하나의 객체로 뷰 이름과 모델 데이터를 함께 전달할 수 있습니다.

주요 구성 요소

1. Model (데이터)

  • 뷰에 전달할 데이터를 저장합니다.

  • addObject(String attributeName, Object attributeValue) 메서드를 사용하여 데이터를 추가합니다.

  • 컨트롤러에서 설정한 모델 데이터는 뷰에서 접근 가능하게 됩니다.

2. View (뷰 이름)

  • 응답을 렌더링할 뷰의 이름을 지정합니다.

  • Spring은 지정된 뷰 이름에 따라 적절한 뷰 리졸버(ViewResolver)를 통해 실제 뷰를 찾습니다.

ModelAndView 생성 및 사용 방법

1. 기본 생성 및 설정

@RequestMapping("/example")
public ModelAndView exampleHandler() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("exampleView"); // 뷰 이름 설정
    mav.addObject("message", "Hello, ModelAndView!"); // 모델 데이터 추가
    return mav;
}

2. 생성자 사용

@RequestMapping("/example2")
public ModelAndView exampleHandler2() {
    return new ModelAndView("exampleView", "message", "Hello, Constructor!");
}

3. 데이터 추가

addObject를 반복적으로 호출하여 여러 데이터를 추가할 수 있습니다.

@RequestMapping("/example3")
public ModelAndView exampleHandler3() {
    ModelAndView mav = new ModelAndView("exampleView");
    mav.addObject("title", "ModelAndView Example");
    mav.addObject("description", "Spring MVC에서 ModelAndView 사용하기");
    return mav;
}

ModelAndView와 모델/뷰 개별 처리 비교

ModelAndView는 모델과 뷰를 한 번에 처리할 수 있는 장점이 있지만, 각각을 개별적으로 처리할 수도 있습니다.

모델과 뷰를 분리한 경우

@RequestMapping("/example4")
public String exampleHandler4(Model model) {
    model.addAttribute("message", "Hello, Model!");
    return "exampleView"; // 뷰 이름 반환
}

언제 ModelAndView를 사용하나요?

1. 뷰와 모델 데이터를 함께 반환할 필요가 있을 때

컨트롤러 메서드에서 뷰 이름과 데이터를 함께 처리해야 할 경우 적합합니다.

2. 유연한 데이터 관리가 필요할 때

특정 조건에 따라 다른 뷰를 반환하거나, 다양한 데이터를 한꺼번에 관리할 때 유용합니다.

ModelAndView 사용 시 주의점

  • 너무 많은 데이터를 ModelAndView에 담으면 코드가 복잡해질 수 있습니다. 필요한 경우, Model이나 @ModelAttribute를 사용하는 방법을 고려하세요.

  • Spring Boot에서는 주로 Model과 뷰 이름을 별도로 처리하는 방식이 더 선호됩니다.

간단한 예제

Controller

@Controller
public class ExampleController {

    @RequestMapping("/greet")
    public ModelAndView greet() {
        ModelAndView mav = new ModelAndView("greeting"); // greeting.jsp로 매핑
        mav.addObject("name", "Spring User");
        return mav;
    }
}

View (greeting.jsp)

<!DOCTYPE html>
<html>
<head>
    <title>Greeting</title>
</head>
<body>
    <h1>Hello, ${name}!</h1>
</body>
</html>

위 예제는 /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 로직과 관련된 코드를 작성합니다.

주요 역할

  1. 클라이언트 요청 매핑

    • @RequestMapping 또는 @GetMapping, @PostMapping 등을 사용하여 특정 URL 요청과 메서드를 연결합니다.

  2. 모델 데이터 전달

    • Model 또는 ModelAndView를 통해 뷰에 데이터를 전달합니다.

  3. REST API 처리

    • @RestController와 함께 사용하면 JSON 데이터를 반환합니다.

예제

@Controller
public class UserController {

    @GetMapping("/users")
    public String getUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "userList"; // userList.jsp로 매핑
    }
}

3. @Repository

정의

@Repository는 데이터 접근 계층(DAO, Data Access Object)에서 사용됩니다. 주로 데이터베이스와의 상호작용을 담당하는 클래스에 붙입니다.

특징

  • 데이터베이스 관련 예외를 Spring의 DataAccessException으로 변환합니다.

  • @Repository가 선언된 클래스는 Spring이 자동으로 빈으로 등록합니다.

주요 역할

  1. 데이터 CRUD 작업 수행

    • 데이터베이스와의 직접적인 상호작용 코드 작성.

  2. 트랜잭션 처리

    • 데이터 접근 계층은 서비스 계층과 협력하여 트랜잭션을 처리합니다.

  3. MyBatis, JPA, Hibernate와 같은 ORM 도구와 함께 사용.

예제

@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> findAll() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new UserRowMapper());
    }
}

4. @Service

정의

@Service는 비즈니스 로직을 담당하는 서비스 계층 클래스에 사용됩니다. 주로 컨트롤러와 데이터 접근 계층 사이에서 중재자 역할을 합니다.

특징

  • 컨트롤러가 요청한 비즈니스 로직을 처리하고 결과를 반환합니다.

  • 서비스 계층에서 트랜잭션을 처리하며, @Transactional 어노테이션과 함께 사용됩니다.

주요 역할

  1. 비즈니스 로직 구현

    • 컨트롤러에서 받은 요청을 처리하고 필요한 데이터를 데이터 계층에서 가져옵니다.

  2. 데이터 계층과의 상호작용

    • 데이터를 조회하거나 저장하기 위해 @Repository를 호출합니다.

  3. 재사용 가능한 로직 작성

    • 여러 컨트롤러에서 호출 가능한 로직을 캡슐화합니다.

예제

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

5. 계층 간 관계

계층 구조

  • 컨트롤러(@Controller): 사용자 요청 처리 및 응답 반환.

  • 서비스(@Service): 비즈니스 로직 구현.

  • 레포지토리(@Repository): 데이터베이스 상호작용.

계층 간 호출 흐름

  1. 클라이언트 요청이 @Controller에 도달합니다.

  2. @Controller는 요청 처리에 필요한 로직을 @Service에 위임합니다.

  3. @Service는 필요한 데이터를 가져오기 위해 @Repository를 호출합니다.

  4. 최종 결과가 @Controller를 통해 클라이언트에게 반환됩니다.

예제 흐름

// Controller
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public String getUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "userList";
    }
}

// Service
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

// Repository
@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> findAll() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new UserRowMapper());
    }
}

ResponseEntity

ResponseEntity는 Spring Framework에서 HTTP 응답을 직접 구성할 수 있도록 제공하는 클래스입니다. HTTP 상태 코드, 헤더, 바디를 명시적으로 제어할 수 있어 RESTful API 개발 시 주로 사용됩니다.

1. ResponseEntity란?

  • Spring MVC에서 HTTP 응답을 표현하는 객체.

  • HTTP 상태 코드, 응답 헤더, 응답 본문(Body)을 포함.

  • ResponseEntity를 사용하면 컨트롤러가 클라이언트에 대해 더 세밀한 응답을 반환할 수 있음.

주요 특징

  1. 유연한 HTTP 상태 코드 설정

    • 응답 상태 코드를 명시적으로 설정 가능.

  2. 응답 헤더 추가

    • 클라이언트에게 추가 정보를 전달할 수 있음.

  3. 응답 본문 반환

    • 객체, 문자열, JSON 데이터 등 다양한 형식의 데이터를 반환 가능.


2. ResponseEntity의 주요 생성 방법

1. 정적 메서드를 사용한 생성

Spring은 ResponseEntity 객체를 쉽게 생성할 수 있도록 다양한 정적 메서드를 제공합니다.

예제: 상태 코드와 바디 설정

@GetMapping("/example")
public ResponseEntity<String> example() {
    return ResponseEntity.ok("응답 성공!");
}
  • ResponseEntity.ok()는 HTTP 200 상태 코드와 함께 응답 바디를 설정.

예제: 상태 코드만 설정

@GetMapping("/no-content")
public ResponseEntity<Void> noContent() {
    return ResponseEntity.noContent().build();
}
  • ResponseEntity.noContent()는 HTTP 204 상태 코드를 반환하며 바디는 포함하지 않음.

예제: 응답 헤더 추가

@GetMapping("/headers")
public ResponseEntity<String> headersExample() {
    return ResponseEntity.ok()
            .header("Custom-Header", "CustomValue")
            .body("헤더와 함께 반환");
}

2. 생성자를 사용한 ResponseEntity 생성

ResponseEntity 생성자를 통해 상태 코드, 헤더, 바디를 직접 설정할 수도 있습니다.

예제

@GetMapping("/manual-response")
public ResponseEntity<String> manualResponse() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Custom-Header", "HeaderValue");
    return new ResponseEntity<>("수동으로 생성된 응답", headers, HttpStatus.CREATED);
}
  • HttpHeaders를 사용해 헤더를 설정하고, HttpStatus.CREATED를 통해 HTTP 201 상태 코드를 반환.


3. ResponseEntity를 사용한 REST API 구현

사용자 정의 객체 반환

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        if (user == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        }
        return ResponseEntity.ok(user);
    }
}
  • 사용자 정보를 조회한 후, 사용자가 없으면 HTTP 404 상태 코드를 반환.

  • 사용자가 존재하면 HTTP 200 상태 코드와 함께 사용자 객체를 반환.


4. 주요 메서드와 활용

정적 메서드

  • ResponseEntity.ok(Object body): HTTP 200 상태 코드와 바디를 설정.

  • ResponseEntity.status(HttpStatus status): 상태 코드를 설정.

  • ResponseEntity.noContent(): HTTP 204 상태 코드를 설정.

  • ResponseEntity.badRequest(): HTTP 400 상태 코드를 설정.

빌더 패턴

ResponseEntity는 빌더 패턴을 지원하여, 연속적으로 메서드를 호출해 응답을 설정할 수 있습니다.

예제: 빌더 패턴 활용

@GetMapping("/builder-example")
public ResponseEntity<String> builderExample() {
    return ResponseEntity.status(HttpStatus.CREATED)
            .header("Location", "/new-resource")
            .body("새로운 리소스가 생성되었습니다.");
}

5. 사용 시 장점

1. 세밀한 HTTP 응답 제어

  • 상태 코드, 헤더, 바디를 명시적으로 제어할 수 있어 클라이언트 요구사항에 맞는 응답 작성이 가능.

2. RESTful API 개발에 적합

  • RESTful API는 상태 코드와 헤더를 명확히 전달하는 것이 중요하므로, ResponseEntity를 통해 이를 쉽게 구현 가능.

3. 코드 가독성 증가

  • ResponseEntity를 활용하면 응답 처리를 명확히 표현할 수 있어 코드 가독성이 향상됨.


6. 사용 시 주의사항

  1. 응답 데이터의 직렬화

    • 객체를 응답 본문에 포함할 경우, Jackson과 같은 JSON 직렬화 라이브러리를 사용해야 함.

  2. 헤더 설정

    • 필요하지 않은 헤더를 추가하지 않도록 주의.

  3. 명시적인 상태 코드 반환

    • 적절한 상태 코드를 사용해 클라이언트가 응답을 명확히 이해할 수 있도록 해야 함.

Previous10 스프링 MVCNext데이터베이스 연동에 필요한 부분

Last updated 4 months ago