들어가며
Spring MVC에서 클라이언트의 요청을 받아 처리하는 역할을 하는 것이 바로 컨트롤러입니다.@Controller 어노테이션은 Spring에게 "이 클래스는 컨트롤러야"라고 알려주는 역할을 합니다.
이 글에서는 @Controller가 무엇인지, Bean 등록과 어떤 관계인지 정리해보겠습니다.
@Controller란?
@Controller는 Spring MVC에서 해당 클래스를 컨트롤러로 지정하는 어노테이션입니다.
두 가지 역할을 동시에 수행합니다.
@Controller의 역할
1. Bean 등록 → Spring 컨테이너가 이 클래스를 관리
2. 자동 URL 매핑 → @RequestMapping으로 요청 URL과 메서드를 연결
@Controller
public class MemberController {
@GetMapping("/members")
public String memberList(Model model) {
// 회원 목록 조회 로직
return "memberList"; // View 이름 반환
}
}
Bean이란?
@Controller를 이해하려면 먼저 Bean이 무엇인지 알아야 합니다.
Bean은 Spring 컨테이너가 생성하고 관리하는 객체입니다.
개발자가 직접 new로 객체를 만드는 게 아니라, Spring이 대신 생성하고 의존성을 주입해줍니다.
// Bean 등록 전 - 개발자가 직접 객체 생성
MemberController controller = new MemberController();
// Bean 등록 후 - Spring이 대신 생성 및 관리
@Controller // Spring 컨테이너에 Bean으로 등록
public class MemberController { ... }
[Spring 컨테이너]
┌─────────────────────────────┐
│ MemberController (Bean) │
│ MemberService (Bean) │ ← Spring이 생성 및 관리
│ MemberRepository (Bean) │
└─────────────────────────────┘
@Controller가 Bean으로 등록되는 과정
Spring Boot 애플리케이션이 시작될 때 컴포넌트 스캔(Component Scan) 이 동작합니다.@Controller, @Service, @Repository, @Component 등의 어노테이션이 붙은 클래스를 자동으로 찾아 Bean으로 등록합니다.
[Spring Boot 시작 과정]
1. @SpringBootApplication 실행
↓
2. 컴포넌트 스캔 시작
→ 패키지 내 @Controller, @Service, @Repository 등 탐색
↓
3. 발견된 클래스를 Bean으로 등록
→ MemberController → Bean 등록
→ MemberService → Bean 등록
↓
4. 의존성 주입 (@Autowired, @RequiredArgsConstructor)
↓
5. 애플리케이션 실행 완료
URL 자동 매핑
@Controller와 함께 @RequestMapping, @GetMapping, @PostMapping 등을 사용하면 URL과 메서드를 자동으로 연결합니다.
@Controller
@RequestMapping("/members") // 공통 URL prefix
public class MemberController {
// GET /members → 회원 목록
@GetMapping
public String memberList(Model model) {
return "memberList";
}
// GET /members/1 → 회원 상세
@GetMapping("/{id}")
public String memberDetail(@PathVariable Long id, Model model) {
return "memberDetail";
}
// POST /members → 회원 등록
@PostMapping
public String createMember(@ModelAttribute MemberDto memberDto) {
return "redirect:/members";
}
// GET /members/1/edit → 수정 폼
@GetMapping("/{id}/edit")
public String editForm(@PathVariable Long id, Model model) {
return "memberEdit";
}
}
Spring이 자동으로 URL과 메서드를 매핑해주기 때문에, 개발자는 비즈니스 로직에만 집중할 수 있습니다.
@Controller vs @RestController
| 항목 | @Controller | @RestController |
|---|---|---|
| 반환값 | View 이름 (JSP, Thymeleaf 등) | 데이터 (JSON, XML) |
| 응답 방식 | View Resolver가 화면 렌더링 | HTTP 바디에 데이터 직접 반환 |
| 구성 | @Controller 단독 사용 |
@Controller + @ResponseBody |
| 사용 예시 | SSR (JSP, Thymeleaf) | REST API |
// @Controller - View 이름 반환 (SSR)
@Controller
public class MemberController {
@GetMapping("/members")
public String memberList(Model model) {
return "memberList"; // memberList.html(jsp) 렌더링
}
}
// @RestController - 데이터 직접 반환 (REST API)
@RestController
public class MemberApiController {
@GetMapping("/api/members")
public List<MemberDto> memberList() {
return memberService.findAll(); // JSON으로 반환
}
}
Spring Bean 어노테이션 종류
@Controller 외에도 역할에 따라 다양한 Bean 등록 어노테이션이 있습니다.
| 어노테이션 | 역할 | 레이어 |
|---|---|---|
@Controller |
요청 처리, URL 매핑 | Presentation (Web) |
@Service |
비즈니스 로직 처리 | Business |
@Repository |
DB 접근 처리 | Persistence (Data) |
@Component |
위 3가지 외 일반 Bean | 공통 |
@Controller // 웹 요청 처리
public class MemberController {
private final MemberService memberService;
}
@Service // 비즈니스 로직
public class MemberService {
private final MemberRepository memberRepository;
}
@Repository // DB 접근
public class MemberRepository {
private final MemberMapper memberMapper;
}
각 어노테이션은 내부적으로 모두 @Component를 포함하고 있어 Bean으로 등록됩니다.
역할에 맞는 어노테이션을 사용하면 코드의 의도가 명확해집니다.
Creator-Flex와의 연관
Creator-Flex 프로젝트에서도 동일한 구조로 컨트롤러를 구성했습니다.
// REST API 방식 - @RestController 사용
@RestController
@RequestMapping("/api/vacation")
@RequiredArgsConstructor
public class VacationController {
private final VacationService vacationService;
@GetMapping
public ResponseEntity<List<VacationDto>> getVacations() {
return ResponseEntity.ok(vacationService.findAll());
}
@PostMapping
public ResponseEntity<Void> createVacation(@RequestBody VacationDto dto) {
vacationService.create(dto);
return ResponseEntity.ok().build();
}
}
정리
@Controller는 해당 클래스를 Spring MVC 컨트롤러로 지정하는 어노테이션이다.- Spring 컨테이너에 Bean으로 등록되어, 개발자가 직접 객체를 생성하지 않아도 Spring이 관리한다.
- 컴포넌트 스캔으로
@Controller가 붙은 클래스를 자동으로 찾아 Bean으로 등록한다. @GetMapping,@PostMapping등과 함께 사용해 URL과 메서드를 자동으로 매핑한다.- View를 반환하는
@Controller와 데이터를 반환하는@RestController로 나뉘며, REST API 개발에는@RestController를 사용한다.
'-- 오늘 있었던 개발 일기' 카테고리의 다른 글
| React의 장점 - 빠른 렌더링? 개발자 관점에서의 효율성 (0) | 2026.05.29 |
|---|---|
| 호이스팅(Hoisting)이란? (1) | 2026.04.15 |
| 인터프리터 언어란? (0) | 2026.04.13 |
| 컴파일 언어란? - 그리고 Java는 어떻게 다를까? (0) | 2026.04.12 |
| 매개변수(Parameter)란? (1) | 2026.04.11 |