|
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
스프링 프레임워크가 버전업 될 때 마다 새로운 어노테이션이 계속 등장하고 있는 실정이다!!!
@Scope : Spring 에서 관리하는 Bean(객체)은 싱글턴 상태가 디폴트이다.
default 및 singleton : 싱글톤 패턴으로 객체를 한 개만 생성
prototype : 사용자 요청 별로 각각의 객체를 생성해서 할당
@Autowired : Bean의 자동 삽입을 위해 사용하는 어노테이션. (type 으로 매핑)
멤버필드, 생성자 메소드에 사용하는 어노테이션으로, 무조건적인 객체에 대한 의존성 주입.
@Resource : Bean의 자동 삽입을 위해 사용하는 어노테이션. (name 으로 매핑)
@Component : Bean을 생성. Java Bean에 등록하지 않아도 자동 주입이 가능하도록 해주는 어노테이션.
@Service : 해당 클래스가 Service Bean 임을 지정.
@Component 어노테이션을 사용해도 상관 없지만 @Component 어노테이션의 기능이 포함되어 있고,
해당 클래스가 비즈니스 로직을 담은 Service의 역할을 하는 것을 명확하게 알 수 있다.
@Repository : 해당 클래스가 Repository Bean 임을 지정.
@Component 어노테이션을 사용해도 되지만 @Component 어노테이션의 기능이 포함되어 있고,
해당 클래스가 DB 관련 역할을 하는 것을 명확하게 알 수 있다.
스프링에서는 기본적으로 클래스 선언부 위에 @Component 어노테이션이 붙어 있으면 스프링 빈으로 생성.
그러나 보통 실무인 경우에 다음과 같이 한다.
Controller 클래스에는 @Controller
Service 클래스에는 @Service
DAO 클래스에는 @Repository
위의 어노테이션 작업 시, 스프링 메타파일(xml) 파일에
<context:component-scan base-package="해당 클래스가 있는 패키지명" />
하면 bean이 자동 생성된다.
--- Spring MVC 인 경우
@MVC : 어노테이션을 중심으로 한 새로운 MVC의 확장 기능은 @MVC라는 별칭으로도 불린다.
@Controller : 해당 클래스가 Controller Bean 임을 지정.
@Component 어노테이션을 사용해도 상관 없지만 @Component 어노테이션의 기능이 포함되어 있고,
해당 클래스가 Controller 역할을 하는 것을 명확하게 알 수 있다.
@RequestMapping : 처리할 요청 URL을 지정.
실제 요청 URL 은 class의 @RequestMapping값과 메서드의 @RequestMapping값의 조합으로 지정.
@RequestMapping(value="/product/form", method="RequestMethod.GET")
@RequestMapping(value="/product/write", method="RequestMethod.POST")
@PathVariable : URL에 {}로 들어가는 패스 변수를 받는다.
URL의 특정 위치에 파라미터 값을 넣게 하면, 이해하기 쉬운 URL을 만들 수 있다. (RESTFull)
@RequestMapping(value = "/article/view/{articleId}", method = RequestMethod.DELETE)
@ResponseBody
public ModelAndView view(@PathVariable(value = "articleId") int articleId) {
articleBO.getArticle(articleId);
...
}
@RequestParam : 단일 HTTP 요청 파라미터의 값을 메소드 파라미터에 넣어주는 어노테이션.
해당 파라미터가 반드시 있어야 한다. 없다면 HTTP 400 - Bad Request를 받게 된다.
파라미터를 필수가 아니라 선택적으로 제공하게 하려면, required 엘리먼트를 false 로 설정한다.
public String view(@RequestParam("id") int id) { .. }
public String view(@RequsetParam(value="id", required=false, defaultValue="-1") { .. }
@RequestParam 에 파라미터 이름을 지정하지 않고 Map<String,String>타입으로 선언하면 모든 요청 파라미터를 맵으로 받을 수 있다.
public String add(@RequestParam<String, String> params) { .. }
@ModelAttribute : 요청 파라미터를 Object(모델객체) 형태로 Controller에서 전달 받을 수 있다.
@RequestBody : HTTP의 Body를 그대로 웹서버로 전달한다.
public void message(@RequstBody String body) { ... }
@ResponseBody : HTTP의 Body를 그대로 클라이언트로 전달한다. xml, json 기반의 메시지를 사용하는 경우 유용하다.
@RequstBody
public void message() { ... }
@Valid : 요청된 파라미터를 모델 클래스에 셋팅하면서 해당 값에 대한 유효성 체크를 함께 할 수 있다.
@Configuration : 한 개 이상의 @Bean을 제공하는 클래스에 명시하는 어노테이션으로, IOC Container에게 해당 클래스가 Bean으로 구성된 클래스라는 것을 알려준다.
@Value는 왜 사용하는가?
DB 연결에 필요한 정보(계정 정보)나 노출되기 민감한 값들을 하드 코딩하게 된다면, 여러 가지 이슈에 휘말릴 수 있다. (깃허브 같은 공유 레퍼지토리에 그대로 코드와 함께 유출될 것이다.) 또한 개발 시엔 로컬에 맞는 환경으로 세팅을 했지만, 클라우드 서버에 올린다거나 배포 환경으로 전환될 때, 직접 해당 코드를 수정해야 하는 번거로움이 있다. 이런 문제들을 막기 위해 민감한 정보나, 메타정보들은 파일로 따로 빼두어 관리하게 된다. (수정과 관리가 용이하기 때문)
이러한 이유로 따로 빼둔 설정 파일을 필요한 곳에 주입시켜주는 어노테이션이 @Value다.
예)
AppConfig.java -----------------------------------
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AppConfig {
@Value("${app.name}")
private String appName;
@Value("${app.version}")
private String appVersion;
@Value("${app.description}")
private String appDescription;
// Getter methods
public String getAppName() {
return appName;
}
public String getAppVersion() {
return appVersion;
}
public String getAppDescription() {
return appDescription;
}
// For demonstration purposes
public void printAppInfo() {
System.out.println("App Name: " + appName);
System.out.println("App Version: " + appVersion);
System.out.println("App Description: " + appDescription);
}
}
applicationContext.xml -----------------------------
<?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.xsd">
<!-- AppConfig 빈 등록 -->
<bean id="appConfig" class="pack.AppConfig" />
</beans>
---------------------------------------------------------------
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
AppConfig appConfig = context.getBean(AppConfig.class);
appConfig.printAppInfo();
}
첫댓글
와....너무너무 중요!!!
허걱 대박이네용 !!