@Controller

코딩냥이·2024년 9월 10일

Annotation

목록 보기
4/34

@Controller

@Controller는 스프링 MVC(Model-View-Controller) 프레임워크에서 웹 요청을 처리하는 클래스를 지정하는 어노테이션입니다.

기능

  • 클래스를 스프링 MVC의 컨트롤러로 표시합니다.
  • 해당 클래스가 웹 요청을 처리할 수 있음을 나타냅니다.
  • 주로 view를 반환하는 전통적인 스프링 MVC 패턴에서 사용됩니다.

사용 방법

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

    @GetMapping("/list")
    public String listUsers(Model model) {
        // 사용자 목록을 모델에 추가
        model.addAttribute("users", userService.getAllUsers());
        return "userList"; // 뷰 이름 반환
    }

    @PostMapping("/add")
    public String addUser(@ModelAttribute User user) {
        userService.addUser(user);
        return "redirect:/users/list";
    }
}

주요 특징

  1. 뷰 반환: 메서드가 String을 반환할 때, 이는 뷰 이름으로 해석됩니다.
  2. 모델 데이터 처리: Model, ModelMap, ModelAndView 등을 통해 뷰에 데이터를 전달할 수 있습니다.
  3. 요청 매핑: @RequestMapping 및 관련 어노테이션(@GetMapping, @PostMapping 등)과 함께 사용하여 HTTP 요청을 특정 메서드에 매핑합니다.

@Controller vs @RestController

  • @Controller는 주로 뷰를 반환하는 전통적인 웹 애플리케이션에 사용됩니다.
  • @RestController는 데이터(주로 JSON)를 직접 반환하는 RESTful 웹 서비스에 사용됩니다.
// @Controller 사용 예
@Controller
public class GreetingController {
    @GetMapping("/greeting")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting"; // greeting.html 뷰를 찾아 렌더링
    }
}

// @RestController 사용 예
@RestController
public class GreetingApiController {
    @GetMapping("/api/greeting")
    public Greeting greeting(@RequestParam(name="name", required=false, defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

데이터 전달 방식

  1. Model 객체 사용:

    @GetMapping("/users")
    public String listUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "userList";
    }
  2. ModelAndView 사용:

    @GetMapping("/users")
    public ModelAndView listUsers() {
        ModelAndView mav = new ModelAndView("userList");
        mav.addObject("users", userService.getAllUsers());
        return mav;
    }
  3. @ModelAttribute 사용:

    @ModelAttribute("globalAttribute")
    public String addGlobalAttribute() {
        return "This is available to all methods";
    }

폼 처리

@Controller는 웹 폼을 쉽게 처리할 수 있습니다:

@GetMapping("/register")
public String showRegistrationForm(Model model) {
    model.addAttribute("user", new User());
    return "registrationForm";
}

@PostMapping("/register")
public String registerUser(@ModelAttribute User user) {
    userService.registerUser(user);
    return "redirect:/registrationSuccess";
}

예외 처리

@Controller 내에서 예외 처리를 할 수 있습니다:

@ExceptionHandler(UserNotFoundException.class)
public String handleUserNotFound(UserNotFoundException ex, Model model) {
    model.addAttribute("errorMessage", ex.getMessage());
    return "error";
}

베스트 프랙티스

  1. 관심사 분리: 비즈니스 로직은 서비스 계층에 두고, 컨트롤러는 요청 처리와 뷰 선택에 집중합니다.
  2. 적절한 HTTP 메서드 사용: GET, POST 등을 목적에 맞게 사용합니다.
  3. RESTful 설계: 리소스 중심의 URL 설계를 고려합니다.
  4. 유효성 검사: @Valid를 사용하여 입력 데이터의 유효성을 검사합니다.
  5. 뷰 네이밍 컨벤션: 일관된 뷰 이름 지정 규칙을 사용합니다.

결론

@Controller는 스프링 MVC의 핵심 어노테이션으로, 웹 애플리케이션의 요청 처리와 뷰 반환을 담당합니다. RESTful API를 구현할 때는 @RestController를 고려할 수 있지만, 전통적인 웹 애플리케이션 개발에는 @Controller가 더 적합합니다.

연관 포스팅

RestController

profile
HelloMeow~!

0개의 댓글