본문 바로가기
-- 오늘 있었던 개발 일기

@Controller란? - Spring 자동 매핑과 Bean 등록

by code study 2026. 5. 6.

들어가며

Spring MVC에서 클라이언트의 요청을 받아 처리하는 역할을 하는 것이 바로 컨트롤러입니다.
@Controller 어노테이션은 Spring에게 "이 클래스는 컨트롤러야"라고 알려주는 역할을 합니다.
이 글에서는 @Controller가 무엇인지, Bean 등록과 어떤 관계인지 정리해보겠습니다.


@Controller란?

@ControllerSpring 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를 사용한다.