카테고리 없음

Java의 어노테이션은 무엇일까..?

hyeijoo1234 2025. 4. 27. 12:37

📢 발표 주제 : 자바의 어노테이션이란 무엇인가?

 

 

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 설정 파일처럼 따로 관리할 필요가 없다.
👉 변경할 때도 간단히 어노테이션 수정만 하면 된다.