| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- js
- CSS
- 이클립스
- Java
- 자바
- vscode
- 자바스크립트
- 배열
- javascript
- 테스트자동화
- html
- Array
- list
- Eclipse
- 자바문법
- java테스트
- 단위테스트
- 정규식
- 문자열
- junit5
- string
- ArrayList
- json
- junit
- input
- IntelliJ
- 인텔리제이
- math
- Visual Studio Code
- HashMap
- Today
- Total
어제 오늘 내일
[Spring Boot 입문 - 7] 어노테이션(@) 지옥 탈출! 자주 쓰는 핵심 5총사 정리 본문
스프링 부트 코드를 보면 자바 문법에는 없는 @ 표시가 정말 많이 나옵니다.
이걸 '어노테이션(Annotation)'이라고 부르는데요.
사전적 의미로는 '주석'이지만, 스프링에서는 '스티커(명찰)'라고 생각하면 이해가 빠릅니다.
1. 어노테이션 = "스프링에게 보내는 편지"
우리가 클래스 위에 @Controller라고 붙이는 건, 스프링에게 이런 메모를 남기는 것과 같습니다.
"스프링아, 이 클래스는 그냥 평범한 자바 파일이 아니야. 내가 '컨트롤러' 역할을 맡겼으니까 네가 알아서 관리해 줘!"
이 스티커가 안 붙어 있으면 스프링은 "얘는 뭐 하는 애인지 모르겠네?" 하고 무시해 버립니다.
그래서 적절한 스티커를 딱딱 붙여주는 게 개발자의 역할입니다.
2. 역할 부여 스티커 (3계층 구조)
지난 시간에 배운 '레스토랑 3인방' 기억하시죠? 그들에게 명찰을 달아주는 어노테이션입니다. 이 명찰을 달아야 스프링이 '빈(Bean)'으로 등록해서 관리해 줍니다.
① @RestController (또는 @Controller)
- 위치: 컨트롤러 클래스 위
- 의미: "나는 웨이터야. 손님 요청이 오면 내가 받을게."
- 특징:
@Controller는 화면(HTML)을 돌려줄 때 쓰고,@RestController는 데이터(JSON)를 돌려줄 때 씁니다. 요즘은 주로@RestController를 많이 씁니다.
② @Service
- 위치: 서비스 클래스 위
- 의미: "나는 셰프야. 중요한 비즈니스 로직은 내가 처리할게."
- 특징: 이 스티커가 붙어 있어야 컨트롤러가 "셰프님 요리해 주세요" 하고 일을 시킬 수 있습니다.
③ @Repository
- 위치: 리포지토리 인터페이스/클래스 위
- 의미: "나는 창고지기야. DB랑 연결해서 데이터 꺼내올게."
- 특징: DB 관련 예외가 터지면 스프링이 알아서 처리해주기도 합니다. (JPA를 쓰면 생략 가능하기도 합니다.)
3. 연결 스티커 (의존성 주입)
직원들을 채용했으면 서로 일을 할 수 있게 연결해줘야겠죠? 웨이터가 셰프를 알고, 셰프가 창고지기를 알아야 하니까요.
④ @Autowired (옛날 방식)
- 의미: "스프링아, 나한테 필요한 객체(친구) 좀 알아서 꽂아줘(Inject)."
- 사용: 필드 변수 위에 붙입니다.
- 단점: 편하긴 한데, 테스트하기 힘들고 순환 참조 문제가 생길 수 있어서 요즘은 비추천합니다.
⑤ @RequiredArgsConstructor (요즘 방식 - 강추!)
- 출처: 롬복(Lombok) 라이브러리
- 의미: "내 클래스에
final이 붙은 변수가 있으면, 걔네를 채워주는 생성자를 자동으로 만들어줘." - 왜 쓰나요? 코드가 훨씬 깔끔해지고 안전합니다.
[비교 체험]
// [옛날 방식 - 비추천]
@Service
public class MyService {
@Autowired // 필드 주입
private MyRepository repository;
}
// [요즘 방식 - 추천]
@Service
@RequiredArgsConstructor // 롬복아, 생성자 만들어줘!
public class MyService {
// final만 붙이면 알아서 주입됨 (생성자 주입)
private final MyRepository repository;
}
여러분은 무조건 아래쪽(@RequiredArgsConstructor) 방식을 쓰시면 됩니다. "아, final 붙은 애들을 스프링이 알아서 연결해 주는구나"라고 이해하세요.
4. 대장 스티커
⑥ @SpringBootApplication
- 위치:
DemoApplication파일 (메인 함수 있는 곳) - 의미: "여기서부터 스프링 부트 시작이다!"
- 특징: 이 스티커가 붙은 위치부터 하위 패키지를 싹 뒤져서, 위에 말한
@Controller,@Service붙은 애들을 다 찾아냅니다. (그래서 파일을 엉뚱한 곳에 만들면 안 되는 겁니다.)
요약: 이 표만 기억하세요
| 어노테이션 | 역할(비유) | 설명 |
| @RestController | 웨이터 | 요청을 받는 컨트롤러 |
| @Service | 셰프 | 로직을 수행하는 서비스 |
| @Repository | 창고지기 | DB에 접근하는 리포지토리 |
| @RequiredArgsConstructor | 전화 연결 | 필요한 친구(객체)를 자동으로 연결해 줌 (의존성 주입) |
| @SpringBootApplication | 본점 간판 | 프로그램 시작점 |
이제 남의 코드를 볼 때, 골뱅이만 봐도 "아, 얘는 서비스네?", "아, 여기서 DB 연결하네?" 하고 해석이 가능해질 겁니다.
이론 무장은 여기까지입니다!
이제 본격적으로 데이터를 저장해 봐야겠죠?
다음 시간에는 진짜 데이터베이스(Database)를 연결해 보겠습니다. 복잡한 설치 없이 H2라는 아주 가벼운 DB를 쓸 거라 겁먹을 필요 없습니다.
다음 편에서 만나요! 👋
'IT > SpringBoot' 카테고리의 다른 글
| [Spring Boot 입문 - 8] 데이터베이스 연동? SQL 몰라도 됩니다 (feat. JPA, H2) (0) | 2026.02.13 |
|---|---|
| [Spring Boot 입문 - 3] 5분 컷! IntelliJ로 첫 프로젝트 만들고 실행하기 (0) | 2026.02.13 |
| [Spring Boot 입문 - 6] Controller, Service, Repository: 3계층 구조 완벽 이해하기 (0) | 2026.02.12 |
| [Spring Boot 입문 - 4] 스프링 부트 동작 원리: 요청(Request)이 들어오면 벌어지는 일 (0) | 2026.02.11 |
| [Spring Boot 입문 - 2] 자바 개발자의 필수템, IoC와 DI 완벽 이해하기 (0) | 2026.02.10 |
