@Controller

Spring MVC에서 HTTP 요청을 처리하는 프레젠테이션 계층 빈을 등록하는 어노테이션입니다. 클라이언트 요청을 받아 응답을 반환합니다.

기본 사용법

@Controller
public class UserController {

    @GetMapping("/users")
    public String list(Model model) {
        model.addAttribute("users", userService.findAll());
        return "user/list";  // 뷰 이름 반환 → HTML 렌더링
    }
}

동작 흐름

클라이언트 요청
    ↓
DispatcherServlet
    ↓
@Controller (요청 처리)
    ↓
ViewResolver (뷰 이름 → 실제 뷰)
    ↓
HTML 응답

@Controller vs @RestController

항목@Controller@RestController
반환뷰 이름 (HTML)데이터 (JSON)
용도SSR (서버 사이드 렌더링)REST API
내부@Component@Controller + @ResponseBody
// @Controller - HTML 반환
@Controller
public class ViewController {
    @GetMapping("/page")
    public String page() {
        return "page";  // templates/page.html
    }
}

// @RestController - JSON 반환
@RestController
public class ApiController {
    @GetMapping("/api/users")
    public List<User> users() {
        return userService.findAll();  // JSON으로 변환
    }
}

@Controller에서 JSON 반환하려면

@Controller
public class UserController {

    // @ResponseBody 추가
    @GetMapping("/api/users")
    @ResponseBody
    public List<User> users() {
        return userService.findAll();  // JSON 반환
    }
}

주요 어노테이션

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

    @GetMapping("/{id}")
    public String detail(@PathVariable Long id, Model model) {
        model.addAttribute("user", userService.findById(id));
        return "user/detail";
    }

    @PostMapping
    public String create(@ModelAttribute UserForm form) {
        userService.save(form);
        return "redirect:/users";
    }
}
어노테이션용도
@RequestMappingURL 매핑 (클래스/메서드)
@GetMappingGET 요청
@PostMappingPOST 요청
@PathVariableURL 경로 변수
@RequestParam쿼리 파라미터
@ModelAttribute폼 데이터 바인딩

왜 @Component 대신 @Controller 쓰나?

// 동작은 하지만 권장하지 않음
@Component
public class UserController { }

// 권장
@Controller
public class UserController { }

CSLOG에서 보기