대부분 프레임워크가 그렇듯이 스프링 프레임워크 역시 XML 설정이 매우 중요하다. 그만큼 XML 파일의 과도한 설정에 대한 부담도 크며, 이로 인해 프레임워크 사용을 꺼리기도 한다. 따라서 대부분 프레임워크는 어노테이션을 이용한 설정을 지원하고 있다.
1. Context 네임스페이스 추가
어노테이션 설정을 추가하려면 다음의 그림과 같이 스프링 설정 파일의 루트 엘리먼트인 <beans>에 Context 관련 네임스페이스와 스키마 문서의 위치를 등록해야 한다.
수정된 소스는 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
// 밑의 소스 추가
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
// 밑의 두 줄 추가
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
</beans>
2. 컴포넌트 스캔(component-scan) 설정
스프링 설정 파일에 애플리케이션에서 사용할 객체들을 <bean> 등록하지 않고 자동으로 생성하려면 <context: component-scan/> 이라는 엘리먼트를 정의해야 한다. 이 설정을 추가하면 스프링 컨테이너는 클래스 패스에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="polymorphism"/>
</beans>
여기서 중요한 것은 <context:component-scan> 엘리먼트의 base-package 속성인데, 만약 속성값을 위와 같이 "polymorphism" 형태로 지정하면 polymorphism 패키지로 시작하는 모든 패키지를 스캔 대상에 포함한다.
3. Annotation 종류
@Configuration
- @Configuration을 클래스에 적용하고
- @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.
@EnableAutoConfiguration
- Spring Application Context를 만들 때 자동으로 설정하는 기능
- classpath의 내용에 기반해서 자동으로 생성한다.
@ComponentScan
- @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 어노테이션이다.
- base-package를 넣으면 해당 패키지 아래에 있는 컴포넌트들을 찾고 그 과정을 spring-context-버전(4.3.11.RELEASE).jar에서 처리한다.
- Spring Framework에서 @Component로 다 쓰지 않고 @Repository, @Service,@Controller등을 사용하는 이유는, DAO(Service)의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.
@Component
- 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
- @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.
@Bean
- 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 어노테이션이다.
- ArrayList같은 라이브러리등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 Method를 만들고 @Bean 어노테이션을 사용하면 된다.
- 아래 첫 번째 코드블럭의 경우 @Bean에 아무런 값을 지정하지 않았으므로 Method 이름을 camelCase로 변경한 것이 Bean id로 등록된다.method 이름이 arrayList()인 경우 arrayList가 Bean id 이다.
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array(){
return new ArrayList<String>();
}
}
@Configuration
public class ApplicationConfig {
@Bean(name="testArray")
public ArrayList<String> array(){
return new ArrayList<String>();
}
}
위와 같이 @Bean에 name이라는 값을 이용하면 자신이 원하는 id로 Bean을 등록할 수 있다.
@Autowired
- 속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.
- 무조건적인 객체에 대한 의존성을 주입시킨다.
- 이 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당한다.
- Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용한다.
- 필드, 생성자, 입력 파라미터가 여러 개인 메소드(@Qualifier는 메소드의 파라미터)에 적용 가능하다.
- Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다(Name으로 강제하는 방법: @Qualifier을 같이 명시)
@Controller
@RequestMapping("/adm/adminuser")
public class AdminAdmUserController {
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private AdminUserService service;
@Autowired
private AuthService authService;
......중략
}
* Bean을 주입받는 방법 5가지
- @Autowired
- @Inject
- @Resource
- Setter
- 생성자(@AllArgsConstructor사용)
@Controller
Spring Framework 에서 서블릿 파일의 역할을 수행하게 하는 어노테이션
@RestController
- Spring 에서 Controller와 달리 View를 리턴하지 않는 Controller 를 의미한다.
- 리턴 값은 JSON 타입의 데이터로 반환한다.
- 이 Annotation이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하고, @ResponseBody 의 역할을 자동으로 해주는 어노테이션이다.
@Service
비즈니스 로직을 수행하는 Class 이라는 의미이다.
@Repository
DB에 접근하는 메소드를 포함한 Class에서 사용된다.
@Required
- Setter 메소드에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알린다.
- @Required 어노테이션을 사용하여 optional 하지 않은, 반드시 필요한 속성들을 정의한다.
- 영향을 받는 bean property를 구성할 시에는 XML 설정 파일에 반드시 property를 채워야 한다.
<!-- Definition for user bean -->
<bean id = "user" class = "com.tutorialspoint.User">
<property name = "name" value = "User1" />
<property name = "age" value = "29"/>
</bean>
@Qualifier
- @Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation이다.(같은 타입이 존재하는 경우 ex) 동물 = 원숭이, 닭, 개, 돼지)
- 같은 타입의 Bean이 두 개 이상이 존재하는 경우에 Spring이 어떤 Bean을 주입해야 할지 알 수 없어서 Spring Container를 초기화하는 과정에서 예외를 발생시킨다.
- 이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 한다.
@Resource
- @Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점은 Autowired는 타입으로, Resource는 이름으로 연결
해준다. - 어노테이션 사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장한다.
@SpringBootApplication
- @Configuration, @EnableAutoConfiguration, @ComponentScan 를 하나로 합쳐놓은 어노테이션
@RequestMapping
- 요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation이다.
- Controller나 Controller의 method에 적용한다.
- 요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
- 요청 받는 형식을 정의하지 않는다면, 자동적으로 GET 방식으로 정의 된다.
@Controller
@RequestMapping("/adm/adminuser")
public class AdminAdmUserController {
@ResponseBody
@RequestMapping(method = RequestMethod.POST ,value = "/update")
public DefResult update(HttpServletRequest req, HttpServletResponse res ,@RequestBody AdminUser adminUser) throws Exception{
// ...중략
}
}
@CrossOrigin
CORS 보안상의 문제로 브라우저에서 리소스를 현재 Origin 에서 다른 곳으로의 AJAX요청을 방지하는 것이다.
//기본 도메인이 https://coding-plant.tistory.com 인 곳에서 온 ajax요청만 수용가능
@CrossOrigin(origins = "https://coding-plant.tistory.com", maxAge = 7200)
@RequestBody
- HTTP 요청 몸체를 자바 객체로 전달받음
- HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할
@RequestMapping(method = RequestMethod.POST ,value = "/update")
public DefResult update(@RequestBody AdminUser adminUser, HttpServletRequest req, HttpServletResponse res) throws Exception{
// 예시파일 내용은 지움
return result;
}
@RequestHeader
- Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용한다.
//ko-KR,ko;q=0.8,en-US;q=0.6
@RequestHeader(value="Accept-Language")String acceptLanguage 로 사용
@PathVariable
method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.
@RequestMapping(value = "/any/path/{id}", method = RequestMethod.GET)
public ResponseEntity<?> any(@PathVariable int id) {
}
@ResponseBody
- 자바 객체를 HTTP 응답 몸체로 전송함
- 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
- 하지만 @RestController 를 사용하면 @ResponseBody 를 따로 기재하지 않아도 됨.
@ResponseBody
@RequestMapping(method = RequestMethod.POST ,value = "/join")
public DefResult join(HttpServletRequest req, HttpServletResponse res, AdminUser param)
throws Exception {
// 예시파일 내용은 지움
return result;
}
@Transactional
데이터베이스 트랜잭션을 설정하고 싶은 method에 Annotation을 적용하면 method 내부에서 일어나는 데이터베이스 로직이 전부 성공하게되거나 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 어노테이션이다.
@Transaction(readOnly=true, rollbackFor=Exception.class)에서 readOnly는 읽기전용임을 알리고
rollbackFor는 해당 Exception이 생기면 롤백하라는 뜻이다.
@Transaction(noRollbackFor=Exception.class)는 해당 Exception이 나타나도 롤백하지 말라는 뜻이다.
@Transaction(timeout = 10)은 10초안에 해당 로직을 수행하지 못하면 롤백하라는 뜻이다.
[출처] https://coding-plant.tistory.com/5
'Spring' 카테고리의 다른 글
Spring pom.xml 오류 해결법 (0) | 2022.08.06 |
---|---|
RequestContextListener (0) | 2022.08.01 |
스프링 JDBC (0) | 2022.05.09 |
IoC, DI의 개념과 예제 (0) | 2022.05.03 |
이클립스(Eclipse)에 스프링(Spring) 설치하기 (0) | 2022.04.26 |