개발자의 서재

[Spring] Annotation 정리(Spring, Lombok, JPA) 본문

SPRING

[Spring] Annotation 정리(Spring, Lombok, JPA)

ironmask431 2022. 2. 19. 15:07

Annotation 이란? 

사전적 의미는 주석. 자바에서 특정요소에 특별한 의미, 기능을 수행하도록 함. 

기본적으로 어노테이션을 사용하는 순서는 다음과 같다. 

1. 어노테이션을 정의한다. 

2. 클래스에 어노테이션을 배치한다.

3. 코드가 실행되는 중에 Reflection 을 이용하여 추가 정보를 획득하여 기능을 실시한다. 

어노테이션 자체는 아무런 동작을 가지지 않는 단순 표식이지만, Reflection 을 통해 기능이 부여된다. 

 

Spring Annotation 종류 

@ComponentScan

@Component  어노테이션이 붙은 클래스 Bean 들을 찾아서

Context에 bean 등록을 해주는 어노테이션 이다. 

(@Controller, @Service, @Repository, @Configuration 는 @Component을 포함하고 있으므로,

마찬가지로 Bean 등록 대상이 된다.)

 

@Component

개발자가 직접 만든 class 를 Bean 으로 등록해주는 어노테이션.

@Bean 과는 다르게 name 이 아닌 value를 이용해 Bean의 이름을 지정한다. 

@Component //이름을 지정하지 않을경우 클래스명을 camelCase로 변경하여 "student" 가 beanId가 됨.
public class Student {
    public Student() {
        System.out.println("hi");
    }
}

@Component(value="mystudent")
public class Student {
    public Student() {
        System.out.println("hi");
    }
}

 

@Bean

개발자가 직접 제어가 불가능한 외부 라이브러리 클래스를 Bean으로 등록할때 사용하는 어노테이션 

public class ApplicationConfig {    
    @Bean //name을 지정하지 않은 경우 메소드명을 camelCase로 변경하여 "array"가 Bean id가 됨.
    public ArrayList<String> array(){
        return new ArrayList<String>();
    }  
    @Bean(name="myarray")
    public ArrayList<String> array2(){
        return new ArrayList<String>();
    }   
}

 

@Controller

클래스에 사용 시 Spring MVC에서 Controller 클래스로 정의된다.

api와 view를 동시에 사용하는 경우 사용. view (화면) 리턴이 주목적이며,

api메소드를 사용 시에는 메소드에 @ResponseBody 어노테이션을 붙여서 사용한다. 

(@Component가 포함되어 있어 bean 등록 대상이 된다. )

 

@RestController

Spring에서 Controller 중 View로 응답하지 않는 Controller 를 의미한다. 

method의 반환결과를 JSON형태로 반환한다. 

이 어노테이션이 있는 Controller 클래스의 method 는 HttpResponse로 바로 응답이 가능하다. 

메소드에 붙이는 @ResponseBody의 역할을 자동적으로 해주는 어노테이션이다. 

(메소드에 @ResponseBody를 별도로 지정해주지 않아도 해당 역할을 수행함.)

view가 필요없는 api만 지원하는 Controller 에서 사용한다. 

data(json, xml등) 리턴이 주목적이다. 

(@Component가 포함되어 있어 bean 등록 대상이 된다.)

 

@ResponseBody

@Controller 내 메소드에 view가 아닌 JSON형식의 값을 리턴하고자 할때 붙여서 사용한다.  

 

@Service

Service 클래스에 쓰인다. 비즈니스 로직을 수행하는 class 라는것을 나타내는 용도이다. 

(@Component가 포함되어 있어 bean 등록 대상이 된다. )

 

@Repository 

DAO 클래스에 쓰인다. DataBase에 접근하는 method를 가지고 있는 class에서 쓰인다. 

(@Component가 포함되어 있어 bean 등록 대상이 된다. )

 

@Configuration

@Configuration 과 @Bean을 사용하면 특정 클래스를 Bean으로 등록 할 수 있다. 

(여기서 빈으로 등록되면 해당 빈을 다른곳에서 쓸때 @Autowired를 생략해도 빈이 주입됨.)

(@Component가 포함되어 있어 bean 등록 대상이 된다. )

 

@ConfigurationProperties

properties 또는 yaml 파일을 읽는다. default 로 application.yaml 파일을 조회한다. 

 

@Value

properties에서 값을 가져와 적용할때 사용한다. 

@Value("${value.from.file}")

 

@Autowired

속성(filed), setter, method, 생성자에 사용하여, Type에 따라 알아서 Bean을 주입해준다. 

(* Bean 이란 스프링컨테이너가 관리하는 자바객체를 말함.)

이 어노테이션을 사용 시 스프링이 자동적으로 값을 할당한다. 

Controller 클래스에서 DAO나 Service 에 관한 객체에 빈을 주입 시킬때 많이 사용한다. 

@Controller
public Class UserController {
	@Autowired
	UserService userService;
}

 

@Qualifier("id123")

@Autowired 와 같이 쓰이며, 같은 타입의 Bean 객체가 두개 이상 있을때 해당 아이디를 적어 원하는

Bean이 주입될수 있도록 하는 어노테이션 

 

@Resources

@Autowired와 Bean 객체를 주입해주는데, 차이점은 Autowired는 타입으로,

Resource는 이름으로 연결해준다. 

 

@Required 

setter method에 적용해주면 Bean 생성시 필수 프로퍼티임을 알린다. 

 

@EnableAutoConfiguration

@SpringBootApplication 에 포함되어 있는 어노테이션

Spring Application Context 를 만들때 자동으로 설정하는 기능을 켠다. 

만약 tomcat-embed-core.jar 가 존재하면 톰캣 서버가 자동 setting 된다.

 

@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나로 합친 어노테이션이다.

스프링부트 구동시 구동되는 메인 클래스에 적용되어 있다. 

 

@RequestMapping

요청 url을 어떤 method로 처리할지 mapping 해주는 어노테이션이다. 

@RequestMapping("/admin", method=RequestMethod.GET)
@RequestMapping("/admin", method=RequestMethod.POST)
@RequestMapping("/admin", method=RequestMethod.PUT)
@RequestMapping("/admin", method=RequestMethod.PATCH)
@RequestMapping("/admin", method=RequestMethod.DELETE)

@GetMapping, @PostMaping, @PutMapping, @PatchMapping, @DeleteMapping

위 메소드 종류에 따른 @RequestMapping을 위 처럼 사용할 수도 있다. 

 

@Scheduled

Linux의 crontab 처럼 정해진 시간에 자동실행 기능 부여

 

Lombok Annotation 종류 

@NoArgsConstructor

기본생성자를 자동으로 추가한다. 

 

@RequiredArgsConstructor

final 로 선언된 필드값만 파라미터로 받는 생성자를 자동 추가한다. 

 

@AllArgsConstructor

모든 필드를 파라미터로 받는 생성자를 추가한다. 

 

@Getter, @Setter

클래스내 모든 필드에 getter 와 setter 메소드 추가

(Entity 클래스에는 Setter를 설정해서는 안됨. 데이터 안전성의 이유 )

 

@ToString 

클래스내 모든 필드에 toString 메소드 자동 생성

 

@Builder

인스턴스 생성시점에 필드값을 채워준다.  생성자와 비슷하지만, 

생성자와 다르게 어떤 필드에 어떤 값을 넣을지를 명확하게 구분하여 입력할 수 있다. 

 

JPA Annotation 종류 

@Entity

실제 DB테이블과 매칭될 entity 클래스임을 명시한다. 

 

@Id

엔티티 클래스의 pk필드를 나타낸다. 

 

@GeneratedValue

pk의 생성규칙을 나타낸다. Long type의 Auto_increment 를 적용하면

MySql의 auto increment 와 같은 자동증가하는 정수형 값이 된다. 

 

@Column 

엔티티 클래스의 컬럼을 나타내며, 선언하지않아도 엔티티 클래스의 필드는 모두 컬럼이된다. 

별도로 기본값외에 컬럼의 타입이나 사이즈를 변경하고자 할때 사용한다. 

 

 

 

내용 참고 : https://velog.io/@gillog/Spring-Annotation-정리

Comments