Annotation
Annotation(@)
은 사전적 의미로 주석이라는 뜻이다. 자바에서Annotation(@)
은 코드 사이에 주석처럼 쓰이며, 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 '메타 데이터'라고 볼 수도 있다.
- 메타 데이터(Meta Data) : 데이터를 위한 데이터
Annotation(@)
은 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공하고, 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공하는 역할도 한다. 또한, 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공한다.
Spring 관련 Annotation
@Bean
@Bean
은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 어노테이션이다. Bean은 뒤에서 자세한 설명이 나오므로 이렇게 사용법만 알아놓고 뒤 강의를 듣고 다시 복습하러 오자.
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array() {
return new ArrayList<String>();
}
}
ArrayList같은 라이브러리등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 메소드를 만들고 @Bean
어노테이션을 사용하면 된다. 위의 경우 @Bean
에 아무런 값을 지정하지 않았으므로 메소드이름을 camelCase로 변경한 것이 Bean id로 등록된다.
@Configuration
public class ApplicationConfig {
@Bean(name = "myarr")
public ArrayList<String> array() {
return new ArrayList<String>();
}
}
위와 같이 @Bean
에 name이라는 값을 이용하면 자신이 원하는 id로 Bean을 등록할 수 있다.
@Component
@Component
는 개발자가 직접 작성한 Class를 스프링에서 객체로 만들어서 관리하는 대상임을 명시하는 어노테이션이다.
@Component
public class Student {
public Student() {
System.out.println("hello");
}
}
@Component( value = "mystd" )
public class Student {
public Student() {
System.out.println("hello");
}
}
@Component
에 대한 추가 정보가 없다면 Class의 이름을 camelCase로 변경한 것이 Bean id로 사용된다. 하지만 @Bean
과 다르게 @Component
는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.
@ComponentScan
@Component
와 @Service
, @Repository
, @Controller
, @Configuration
이 붙은 클래스 Bean들을 찾아서 스프링 컨테이너에 Bean으로 등록해주는 어노테이션이다.
Spring에서 @Component
로 다 쓰지 않고 @Repository
, @Service
, @Controller
등을 사용하는 이유는, @Repository
의 DAO와 같은 메소드 등에서 발생할 수 있는 unchecked exception등의 예외를 스프링의 DataAccessException으로 처리할 수 있기 때문이다. 또한 가독성에서도 해당 어노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.
@Autowired
@Autowired
는 생성자나 Setter와 같은 메소드 없이 의존성을 주입해서 자동으로 객체를 생성해주는 어노테이션이다.
이 어노테이션을 사용할 시 스프링이 자동적으로 값을 할당해주며 Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용한다. 타입을 먼저 확인한 후 못 찾으면 이름(Name)에 따라서 주입한다.
Bean을 주입 받는 방식
1. @Autowired
2. Setter
3. 생성자(@AllArgsConstructor 사용) = 권장 방식
@Controller
@Controller
는 요청과 응답을 처리해주는 클래스에 사용된다. Spring의 Controller를 의미하며, Spring MVC에서 Controller 클래스에 쓰인다.
@RestController
@RestController
는 Spring MVC Controlle에 @ResponseBody
가 추가된 것이다. 주로 메소드의 반환 결과를 JSON 형태로 객체 데이터를 반환한다. 데이터를 응답으로 제공하는 Restful API를 개발할 때 주로 사용한다.
이 어노테이션이 적혀있는 Controller의 메소드는 HttpResponse로 바로 응답이 가능하다. 즉, @ResponseBody
역할을 자동적으로 해주는 어노테이션이다. @Controller
+ @ResponseBody
를 사용하면 @ResponseBody
를 모든 메소드에 적용한다.
@Controller와 @RestController의 차이
@Controller
1. Api와 View를 동시에 사용하는 경우에 사용한다. 대신 Api서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
2. View(화면) return이 주목적이다.
@RestController
1. View가 필요없는 Api만 지원하는 서비스에서 사용한다.
2. @RequestMapping 메소드가 기본적으로 @ResponseBody의미를 가정한다.
3. Data(json, xml 등) return이 목적이다.
더 자세한 차이점을 알고 싶으면 여기를 참고해주세요.
@Service
@Service
는 Service Class에 쓰인다. 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다.
@Repository
@Repository
는 DAO Class에서 쓰인다. DataBase에 접근하는 메소드를 가지고 있는 Class에서 쓰인다.
@Configuration
@Configuration
은 Class가 환경 설정과 관련된 파일이라는 것을 알려주는 어노테이션이다. @Configuration
이 정의된 @Bean
이 적용된 메소드는 @Autowired
를 통해서 부를 수 있다.
@Transactional
@Transactional
은 데이터베이스 트랜잭션을 설정하고 싶은 메소드에 Annotation을 적용하면 메소드 내부에서 일어나는 데이터베이스 로직이 전부 성공하게 되거나 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 어노테이션이다.
@Transactional(readOnly = true, rollbackFor = Exception, class)
: readOnly는 읽기 전용임을 알리고, rollbackFor는 해당 예외가 발생하면 롤백하라는 뜻이다.@Transactional(noRollbackFor = Exception.class)
: 해당 예외가 나타나도 롤백하지 말라는 뜻이다.@Transactional(timeout = 10)
: 10초안에 해당 로직을 수행하지 못하면 롤백하라는 뜻이다.
메소드 내에서 예외가 발생하면 해당 메소드에서 이루어진 모든 DB 작업을 초기화한다. 정확히 얘기하면, 이미 넣은걸 롤백시키는건 아니며, 모든 처리가 정상적으로 됐을때만 DB에 커밋하고 그렇지 않은 경우엔 커밋하지 않는것이다.
비지니스 로직과 트랜잭션 관리는 대부분 Service에서 관리한다. 따라서 일반적으로 DB 데이터를 등록/수정/삭제 하는 Service 메소드는 @Transactional
어노테이션을 필수적으로 가져간다.
@ExceptionHandler
@ExceptionHandler
는 Controller에서 발생하는 예외를 잡아서 처리해주는 메소드에 사용된다.
JPA관련 Annotation
JPA를 사용하면 DB데이터에 작업할 경우 실제 쿼리를 사용하지 않고 Entity 클래스의 수정을 통해 작업한다.
@Entity
@Entity
는 실제 DB 테이블과 링크될 클래스임을 나타낸다. 가장 핵심적인 클래스로 클래스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭한다.
SalesManager.java -> Sales_Manager table
@Table
@Table
은 Entity Class에 매핑할 테이블 정보를 알려준다.
@Table(name = "USER")
Controller에 쓸 DTO(Data Transfer Object)클래스란?
DTO(Data Transfer Object)클래스는 데이터의 전송을 담당하는 클래스이다. DB에서 데이터를 얻어 Service나 Controller 등으로 데이터를 보낼 때 사용한다. 로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메서드만을 갖는다.
Request와 Response용 DTO는 View를 위한 클래스이다. 변경이 자주 필요한 클래스이다. toEntity() 메서드를 통해서 DTO에서 필요한 부분을 이용하여 Entity로 만든다. 또한 Controller에서 Response DTO 형태로 Client에 전달한다.
Entity 클래스와 DTO 클래스를 분리하는 이유는 View와 DB의 역할을 철저하게 분리하기 위해서이다. 테이블과 매핑되는 Entity 클래스가 변경되면 여러 클래스에 영향을 끼치게 되는 반면에 View와 통신하는 DTO 클래스(Request/ Response 클래스)는 자주 변경되므로 분리해야 한다.
Controller에 쓸 DAO(Data Acess Object)클래스란?
DAO(Data Acess Object)클래스는 실제로 DB에 접근하는 클래스이다. Service와 DB를 연결하는 역할을 한다.
@Id
해당 테이블의 PK 필드를 나타낸다.
@GeneratedValue
PK의 생성 규칙을 나타낸다. 기본값은 AUTO로, MySQL의 auto_increment와 같이 자동 증가하는 정수형 값이 된다.
@Column
테이블의 컬럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 컬럼이 된다.
@Column을 생략하면 필드명을 사용해서 컬럼명과 매핑 → @Column(name = "username")
@Column
을 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용한다.
잘못된 정보가 있거나 오타가 있으면 댓글 달아주세요!
감사합니다 :)
'Backend > Spring - Core' 카테고리의 다른 글
Spring #4. 스프링 컨테이너와 스프링 빈 (0) | 2022.12.25 |
---|---|
Spring #3. 객체 지향 원리 적용 (2) (0) | 2022.12.22 |
Spring #3. 객체 지향 원리 적용 (1) (0) | 2022.12.22 |
Spring #2. 스프링 핵심 원리 기본편 - 비즈니스 요구사항과 설계 (1) | 2022.12.21 |
Spring #1. Spring 프레임워크 기본 개념 (0) | 2022.12.18 |