[Spring] Controller와 어노테이션

2022. 2. 27. 14:00·Spring/Spring

 

1. Controller의 종류


Controller 어노테이션은 @Component를 구체화하여 만든 어노테이션으로 해당 클래스를 IoC컨테이너에 Bean으로 등록해주며 Controller로 사용된다는 것을 알려준다.

그 종류에는 View를 리턴하는  @Controller 와 Json 데이터를 리턴하는  @RestController 가 있다.

사용 예시는 아래와 같다.

 

- @Controller

@Controller
public class MyController {
	....
}

 

- @RestController

@RestController
public class MyController {
	....
}

 

 

 

2. 컨트롤러와 함께 사용되는 Mapping 어노테이션(HTTP 요청)


  • @RequestMapping

특정 URI로 요청이 올 때 어떤 메소드로 처리할지 매핑해주는 어노테이션이다. 옵션에 따라 주소를 정하거나 매핑의 방식을 정할 수 있다.

옵션 설명
value 연결할 URL을 설정
다른 옵션이 없다면 생략 가능
method enum으로 정의되어있는 RequestMethod를 통해 사용
주로 GET, POST, PUT, DELETE를 많이 사용함.
params 쿼리문으로 파라미터를 전달받기 위해 사용 

(옵션에 대한 자세한 설명이 아래 블로그에 잘 설명되어 있습니다!

Tecoble 블로그: https://tecoble.techcourse.co.kr/post/2021-06-18-spring-request-mapping/ )

 

@RestController
@RequestMaping("/api")
public class MyController {
    
    @RequestMapping(value="/user", method=RequestMethod.GET, params={"username"})
    public User showUser(@RequestParam("username") String username){ // username을 가진 user 조회
        ....
    }
}

 

 

  • @GetMapping

데이터를 가져올 때 사용하는 어노테이션으로 @RequestMapping 중에서도 GET방식으로 구체화된 어노테이션이라고 생각하면 된다.

@RestController
@RequestMaping("/api")
public class MyController {
    
    @GetMapping("/users")
    public User showUser(){
        ....
    }
}

 

 

  • @PostMapping

데이터를 입력할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 POST방식으로 구체화된 어노테이션이다.

@RestController
@RequestMaping("/api")
public class MyController {
    
    @PostMapping("/join")
    public User joinUser(@RequestBody User user){  // 회원가입할 때 정보입력
        ....
    }
}

 

 

  • @PutMapping

데이터를 수정할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 PUT방식으로 구체화된 어노테이션이다.

@RestController
@RequestMaping("/api")
public class MyController {
    
    @PutMapping("/user/{id}")
    public User changeInfo(@PathVariable int id, String password, String email){ // 회원정보 수정
        ....
    }
}

 

 

  • @DeleteMapping

데이터를 삭제할 때 사용하는 어노테이션으로 @RequestMapping 중에서도 DELETE방식으로 구체화된 어노테이션이다.

@RestController
@RequestMaping("/api")
public class MyController {
    
    @GetMapping("/delete/{id}")
    public User deleteUser(@PathVariable int id){ // id값을 통한 회원탈퇴
        ....
    }
}

 

 

 

 

3. 컨트롤러에서 Parameter 받기


  • @RequestParam

@RequestParam은 클라이언트가 요청한 URL이 파라미터 값과 이름이 함께 전달할 때 쿼리스트링에서 파라미터 값을 가져오는 어노테이션이다. 대부분 Get방식의 통신에서 사용되지만 때때로 다른 방식으로 사용하기도 한다.

예를 들어 "localhost:8080/api/user?username=hello&password=1234" 로 URL요청이 들어올 때 파라미터를 받고 싶다면, 아래와 같이 작성할 수 있다.

쿼리문에 적힌 파라미터 이름과 메소드에 적힌 이름이 같게 하면 굳이 어노테이션을 적어주지 않아도 작동된다.

@RestController
@RequestMaping("/api")
public class MyController {
    
    @GetMapping("/user")
    public User showUser(@RequestParam String username, @RequestParam String password){ 
        ....
    }
}

username에 "hello"가 담기고 password에는 "1234"가 들어가게 된다.

 

 

  • @RequestBody

포스트맨이나 프로그램에서 Post 방식과 Put 방식으로 객체를 전송할 때 그것을 받아오기 위해 사용할 수 있는 어노테이션이다. MessageConverter를 통해 Json데이터를 자바 객체로 변환하여 전달받는다.

 text/plain 이나  application/json 타입의 데이터를 받을 때 사용한다.

(cf.  x-www-form-urlencoded 는 @ReqeustBody없이 값을 받는다.)

@RestController
@RequestMaping("/api")
public class MyController {
    
    @PostMapping("/join")
    public User joinUser(@RequestBody User user){  // 회원가입할 때 정보입력
        ....
    }
}

 

 

  • @PathVariable

URL 경로에 들어간 값을 변수로 활용하고 싶을 때 사용하는 어노테이션이다. 경로에 들어간 {변수이름} 과 메소드의 매개변수이름이 똑같아야 한다. 만약 다르다면 @PathVariable("변수이름") 과 같이 지정해줄 수도 있다.

 

@RestController
@RequestMaping("/api")
public class MyController {
    
    @GetMapping("/delete/{id}")
    public User deleteUser(@PathVariable int id){ // id값을 통한 회원탈퇴
        ....
    }
}

 

 

  • @ModelAttribute

Parameter 형식으로 데이터를 전달받을 때 사용한다. 클라이언트가 전달한 파라미터를 Setter 함수또는 생성자를 통해 객체에 데이터를 1대1로 바인딩하는 어노테이션이다. 그러므로 Setter 메소드와 생성자가 필수이다!!

@RequestParam와 굉장히 유사하지만 약간 다른데, @RequestParam가 값을 하나씩 받아온다면, @ModelAttribute는 데이터를 여러 개 가지고 있는 Model 객체로 받아올 수 있다.

 

- 모델(User)

@AllArgsConstructor
@Data
public class User {

    private int id;
    private String username;
    private String password;
}

 

 

- 컨트롤러

@RestController
@RequestMaping("/api")
public class MyController {
    
    @GetMapping("/user")
    public User user(@ModelAttribute User user){ 
        ....
    }
}

"localhost:8080/api/user?id=1&username=hello&password=1234"로 요청하면

User(id=1, username="hello", password="1234")로 정보를 받았을 것이다.

 

 

 

 

4. 리다이렉션하기(redirection)


다른 메소드를 재사용하고 싶을 때 사용하는 방법으로 return할 때 "redirect:/주소지" 형식으로 하면, 그 주소지를 재사용할 수 있게 해준다.

 

아래 코드는 로그인 폼에서 로그인 정보를 입력하고 로그인 버튼을 클릭하면 "/login" 주소지로 이동해 폼에 입력된 내용을 토대로 로그인을 진행하는 코드이다. 작업이 완료되면 "/home"으로 리다이렉션된다.

(참고: 리다이렉션될 때 HTTP 상태코드는 302이다.)

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HttpRedirectionController {

	@GetMapping("/home")
	public String home() {
		.....
		return "home";
	}
    
	@GetMapping("/loginForm")
	public String loginForm() {
		.....
		return "loginForm"; // 폼에서 로그인 버튼을 누르면 /login 주소로 이동됨.
	}
	
	@GetMapping("/login")
	public String login() { // 로그인 과정을 적은 코드
		..... 
		return "redirect:/home"; // 로그인이 완료되면 home주소로 리다이렉트됨
	}
}

 

 

 

'Spring/Spring' 카테고리의 다른 글
  • [Spring] 스프링 이벤트로 유연한 설계 만들기
  • [Spring] RestClient URI Encoding 문제 (feat. 퍼센트 인코딩)
  • [Spring] 스프링 MVC 사용을 위한 의존관계 추가
  • [Spring] 스프링 프레임워크 의존관계
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (203)
      • Spring (23)
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4)
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (1)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    Spring
    jsp
    GitHub
    알고리즘
    스프링부트
    부스트캠프 멤버십
    Git
    오류해결
    운영체제
    자바
    스프링
    java
    부스트캠프 7기
    웹개발
    부스트캠프
    파이썬
    자바스크립트
    MySQL
    Python
    os
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[Spring] Controller와 어노테이션
상단으로

티스토리툴바