Java의 어노테이션은 무엇일까..?
📢 발표 주제 : 자바의 어노테이션이란 무엇인가?
1. 어노테이션이란?
어노테이션(annotation)은
주석처럼 붙이는 특별한 메타데이터를 말한다.
쉽게 말하면, 코드에 달아주는 작은 명령어나 힌트라고 생각하면 된다.
- 프로그램 실행에는 직접적인 영향을 주지 않는다.
- 대신 컴파일러나 프레임워크가 어노테이션을 읽고 특별한 동작을 할 수 있게 도와준다.
어노테이션은 코드에 정보를 추가하는 도구..? 메모다. -> 포스트잇이라 생각하면 편하다.
2. 어노테이션은 왜 사용할까?
코드를 더 깔끔하고 명확하게 표현하기 위해 사용한다.
또한,
- 컴파일러에게 경고를 주거나
- 런타임에 특별한 처리를 하거나
- 자동으로 코드를 생성하거나 하는 데에 사용한다.
"복잡한 코드를 줄이고, 반복 작업을 줄이기 위해 어노테이션을 쓴다."
3. 어노테이션 기본 예시
@Override
public String toString() {
return "Hello";
}
- @Override는 "이 메서드는 부모 클래스를 오버라이드한 것이다"라는 의미를 가진다.
- 컴파일러가 잘못 오버라이드했을 때 에러를 잡아준다.
4. 자바에 기본으로 제공하는 주요 어노테이션
어노테이션 설명
@Override | 메서드 오버라이드 표시 |
@Deprecated | 더 이상 사용하지 말라는 경고 표시 |
@SuppressWarnings | 컴파일 경고 무시하기 |
@FunctionalInterface | 함수형 인터페이스임을 명시 |
5. 직접 어노테이션을 만들 수도 있다
자바에서는 나만의 어노테이션을 만들 수도 있다.
직접 만드는 예시
@interface MyAnnotation {
String value();
}
이렇게 정의하고, 사용할 때는
@MyAnnotation(value = "테스트")
public class TestClass {
}
처럼 붙여준다.
6. 어노테이션이 동작하는 방식
어노테이션은 크게 세 단계로 동작한다.
단계 설명
1단계 | 코드에 어노테이션을 작성한다 |
2단계 | 컴파일러나 프레임워크가 어노테이션을 읽는다 |
3단계 | 읽은 정보에 따라 특정 동작을 수행한다 |
"어노테이션은 혼자서 뭔가 하는 게 아니라, 어노테이션을 해석하는 도구가 함께 있어야 의미가 생긴다."
7. 어노테이션의 사용 대상
어노테이션은 다양한 곳에 붙일 수 있다.
- 클래스
- 메서드
- 변수
- 생성자
- 파라미터
등에 붙일 수 있다.
예시
public class MyClass {
@Deprecated
private String oldField;
@Override
public String toString() {
return "hello";
}
}
8. 어노테이션은 어디에 많이 쓰일까?
실무에서는 어노테이션이 정말 많이 쓰인다.
- Spring 프레임워크
@Controller, @Service, @Autowired, @RequestMapping 우리가 사용했던 이런 것 전부 어노테이션이다. - JPA (데이터베이스 ORM)
@Entity, @Id, @Column 같은 것들. - 테스트 코드 작성
@Test 어노테이션을 달아서 테스트 메서드임을 표시한다.
"실제로는 어노테이션이 없으면 현대 자바 프로그래밍이 성립이 안될 정도로 많이 쓰인다."
우리가 사용했던 어노테이션들 정리하기
8-1. @RequiredArgsConstructor
- 필수(final) 멤버만 생성자로 만들어주는 어노테이션이다.
- 롬복(Lombok) 라이브러리에서 제공한다.
- 필드에 final이 붙어있으면, 그 필드를 자동으로 초기화하는 생성자를 만들어준다.
✅ 예시
@RequiredArgsConstructor
@Controller
public class FormController {
private final FormService formService;
👉 생성자가 자동으로 만들어져서, formService를 바로 주입받을 수 있다.
8-2. @Controller
- Spring MVC패턴에서 컨트롤러 클래스를 나타내는 어노테이션이다.
- 이 어노테이션이 붙으면, 요청(HTTP 요청)을 처리하는 클래스로 등록된다.
✅ 예시
@Controller
public class BoardController {
// 요청을 받아 처리하는 메서드 작성
}
👉 웹 요청을 받아서 화면(View)로 이동시킬 때 주로 사용한다.
8-3. @GetMapping("list.bo")
- GET 요청을 처리하는 메서드를 지정할 때 사용하는 어노테이션이다.
- 괄호 안에는 요청 URL을 넣는다.
- 이 경로로 들어오는 GET요청들을 다 처리하겠다 라는 표현?
✅ 예시
@GetMapping("list.bo")
public String listBoard() {
return "board/list";
}
👉 list.bo 주소로 GET 요청이 들어오면 이 메서드가 실행된다.
8-4. @PostMapping("insert.bo")
- POST 요청을 처리하는 메서드를 지정할 때 사용하는 어노테이션이다.
- 주로 폼(form) 제출, 데이터 등록에 사용한다.
- 이 경로로 들어오는 POST요청을 다 처리하겠다 라는 표현?
✅ 예시
@PostMapping("insert.bo")
public String insertBoard(Board board) {
// 게시글 저장 로직
return "redirect:/list.bo";
}
👉 insert.bo 주소로 POST 요청이 들어오면 실행된다.
8-5. @Slf4j
- 로그를 쉽게 쓸 수 있게 해주는 롬복 어노테이션이다.
- 자동으로 Logger 객체를 만들어준다.
✅ 예시
@Slf4j
public class SampleService {
public void doSomething() {
log.info("작업을 시작합니다.");
}
}
👉 System.out.println 대신 log.info, log.error 등으로 깔끔하게 로그를 남길 수 있다.
8-6. @Getter, @Setter
- 클래스의 모든 필드에 대해 getter/setter 메서드를 자동으로 만들어주는 롬복 어노테이션이다.
✅ 예시
@Getter
@Setter
public class Member {
private String name;
private int age;
}
👉 getName(), setName() 같은 메서드를 직접 안 써도 된다.
8-7. @NoArgsConstructor
- 파라미터가 없는 기본 생성자를 자동으로 만들어주는 롬복 어노테이션이다.
✅ 예시
@NoArgsConstructor
public class Member {
}
👉 기본 생성자(Member() {})를 자동으로 만들어준다.
8-8. @AllArgsConstructor
- 모든 필드를 매개변수로 받는 생성자를 자동으로 만들어주는 롬복 어노테이션이다.
✅ 예시
@AllArgsConstructor
public class Member {
private String name;
private int age;
}
👉 new Member("홍길동", 20)처럼 객체를 바로 만들 수 있다.
8-9. @ToString
- 클래스의 toString() 메서드를 자동으로 만들어주는 롬복 어노테이션이다.
- 객체 내용을 문자열로 쉽게 출력할 수 있다.
✅ 예시
@ToString
public class Member {
private String name;
private int age;
}
👉 System.out.println(member); 하면 알아서 필드값이 출력된다.
8-10. @EqualsAndHashCode
- equals()와 hashCode() 메서드를 자동으로 만들어주는 롬복 어노테이션이다.
- 객체 비교나 컬렉션(Set, Map)에 쓸 때 유용하다.
✅ 예시
@EqualsAndHashCode
public class Member {
private String name;
}
👉 이름이 같은 두 Member 객체를 equals()로 비교할 수 있다.
8-11. @Autowired
- Spring이 의존성 주입(Dependency Injection)을 자동으로 해주는 어노테이션이다.
- 객체를 직접 new로 생성하지 않고, 스프링이 알아서 주입해준다.
✅ 예시
@Autowired
private MemberService memberService;
👉 MemberService 객체를 스프링이 자동으로 주입해준다.
9. 결론 정리
- 어노테이션은 코드에 정보를 추가하는 작은 명령어다.
- 코드 실행에는 직접적인 영향이 없지만, 컴파일러나 프레임워크가 이를 해석해 다양한 기능을 수행한다.
- 자바에서는 기본 어노테이션도 많고, 직접 어노테이션을 만들어서 쓸 수도 있다.
- 실제 개발에서는 Spring, JPA, 테스트 프레임워크 등 수많은 곳에서 필수적으로 사용된다.
👍 어노테이션을 왜 사용할까?
코드를 간결하게 만들기 위해
👉 복잡한 설정이나 반복적인 코드를 줄일 수 있다.
👉 예를 들어, @Getter, @Setter 하나만 붙여도 메서드 수십 줄을 생략할 수 있다.
자동화와 편의성을 높이기 위해
👉 스프링 같은 프레임워크가 어노테이션을 보고 알아서 필요한 동작을 해준다.
👉 개발자가 일일이 객체를 만들고 설정하는 번거로움을 없애준다.
코드의 의미를 명확히 하기 위해
👉 @Controller, @Service처럼, 이 클래스가 어떤 역할을 하는지 한눈에 알 수 있다.
👉 팀원끼리 협업할 때도 코드 읽기가 훨씬 수월하다.
유지보수를 쉽게 하기 위해
👉 설정이 코드에 직접 드러나 있기 때문에, XML 설정 파일처럼 따로 관리할 필요가 없다.
👉 변경할 때도 간단히 어노테이션 수정만 하면 된다.