[Spring] Controller 작성법

Yunh0·2024년 12월 16일
post-thumbnail

Spring Boot에서 Controller를 작성하려면, 주로 MVC 패턴을 따라 HTTP 요청을 처리하고, 필요한 데이터를 반환하거나 뷰를 렌더링한다.

1. Controller 관련 주요 어노테이션

@Controller

  • 해당 클래스를 웹 컨트롤러로 선언한다. 주로 HTML 기반의 뷰 템플릿과 연동된다.
    • 요청을 처리하는 메서드를 작성하고, 뷰 이름을 반환한다.
    • 데이터를 전달하려면 Model 또는 ModelMap 객체를 활용한다.
@Controller
@RequestMapping("/home")
public class HomeController {

    @GetMapping("/welcome")
    public String welcome(Model model) {
        model.addAttribute("message", "Welcome to Spring Boot!");
        return "welcome"; // welcome.html 렌더링
    }
}

@RestController

  • @Controller + @ResponseBody 역할을 수행한다.
    • 데이터를 JSON, XML 등으로 반환하며, RESTful API 개발에 사용된다.
    • 뷰 이름이 아닌 객체나 데이터를 직접 반환한다.
@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/data")
    public Map<String, String> getData() {
        Map<String, String> response = new HashMap<>();
        response.put("status", "success");
        return response; // JSON 반환
    }
}

@RequestMapping

  • 특정 URL 패턴을 컨트롤러 클래스나 메서드에 매핑한다.
    • 클래스나 메서드 레벨에 선언하며, HTTP 메서드를 지정할 수 있다.
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/profile", method = RequestMethod.GET)
    public String userProfile() {
        return "profile"; // profile.html 반환
    }
}

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping

  • 특정 HTTP 메소드에 대한 요청을 처리한다.
    • @GetMapping : GET 요청
    • @PostMapping : POST 요청
    • @PutMapping : PUT 요청
    • @DeleteMapping : DELETE 요청
  • 간결하게 요청을 처리하는 메서드를 선언한다.
@RestController
@RequestMapping("/items")
public class ItemController {

    @GetMapping("/{id}")
    public String getItem(@PathVariable int id) {
        return "Item ID: " + id;
    }

    @PostMapping
    public String createItem(@RequestBody String item) {
        return "Created Item: " + item;
    }
}

@PathVariable

  • URL 경로의 변수 값을 메소드 매개변수로 전달한다.
    • 경로와 변수명을 일치시키거나, 별도로 매핑한다.
@GetMapping("/products/{id}")
public String getProduct(@PathVariable("id") int productId) {
    return "Product ID: " + productId;
}

@RequestParam

  • 쿼리 파라미터나 폼 데이터를 매개변수로 받아온다.
    • 기본값 설정 및 필수 여부 지정이 가능하다.
    • required = false는 필수값이 아니게 된다.
    • defaultValue로 해당 쿼리 파라미터가 존재하지 않을 때 디폴트 값을 설정할 수 있다.
  • 아래 예시 요청 : http://localhost:8080/search?name=yunho&age=25
@GetMapping("/search")
public String search(
	@RequestParam(value = "name", required = true) String name,
    @RequestParam(value = "age", required = false, defaultValue = "20") String age
) {
    return "name: " + name + "age: " + age;
}

@RequestBody

  • HTTP 요청 본문을 자바 객체로 매핑한다.
    • 주로 JSON 데이터를 처리할 때 사용된다.
  • 매개변수로 받은 데이터를 자동으로 역직렬화한다.
@PostMapping("/orders")
public String createOrder(@RequestBody Order order) {
    return "Order created: " + order.getId();
}

@ResponseBody

  • 메소드의 반환 값을 HTTP 응답 본문에 직접 쓰도록 설정한다.
    • JSON 응답이 필요할 때 사용된다.
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
    return "Hello, World!";
}

@SessionAttributes

  • 특정 데이터를 세션 범위에서 관리하도록 지정한다.
    • 세션에 저장할 키를 지정하고, Model로 전달한다.
@Controller
@SessionAttributes("username")
public class SessionController {

    @GetMapping("/login")
    public String login(Model model) {
        model.addAttribute("username", "JohnDoe");
        return "loginView";
    }

    @GetMapping("/welcome")
    public String welcome(@ModelAttribute("username") String username) {
        return "Welcome, " + username;
    }
}

@ExceptionHandler

  • 특정 예외를 처리하는 메소드를 정의한다.
    • 컨트롤러 내 또는 @ControllerAdvice로 전역 처리 가능하다.
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleException(IllegalArgumentException e) {
    return ResponseEntity.badRequest().body(e.getMessage());
}

2. 데이터 전달 및 상태 관리 객체

Model

  • 데이터를 뷰로 전달하는 데 사용된다.
  • addAttribute() 메소드로 데이터를 추가한다.
@GetMapping("/welcome")
public String welcome(Model model) {
    model.addAttribute("message", "Welcome!");
    return "welcome";
}

ModelMap

  • Model과 유사하지만, Map 기반으로 동작한다.
  • 데이터를 키-값 형태로 저장한다.
  • ModelMap은 클래스로, Model과 내부적으로 사용하는 객체 타입과 메서드 모두 동일하다.
@GetMapping("/info")
public String info(ModelMap modelMap) {
    modelMap.addAttribute("version", "1.0");
    return "infoView";
}

HttpSession

  • 세션 데이터를 관리한다.
  • setAttribute로 데이터를 저장한다.
@GetMapping("/setSession")
public String setSession(HttpSession session) {
    session.setAttribute("user", "JohnDoe");
    return "Session set for JohnDoe";
}

HttpServletRequest

  • HTTP 요청 정보를 제공한다.
  • 클라이언트 IP, 요청 헤더 등을 조회할 수 있다.
@GetMapping("/clientInfo")
public String clientInfo(HttpServletRequest request) {
    return "Client IP: " + request.getRemoteAddr();
}
profile
백엔드 개발자를 꿈꾸면서 현재 공부중입니다!

0개의 댓글