@SpringBootApplication 세가지 기능이 있다.
1. @Configuration
: 빈을 생성할 때 Singleton으로 한번만 생성한다 그리고는 각종 설정을 세팅한다.
2. @EnableAutoConfiguration
: 스프링 어플리케이션 컨텍스트를 만들때 자동으로 설정하는 기능을 킨다.
사용자가 필요할 것 갗은 빈을 추측해서 ApplicationContext 만들 필요한 설정을 한다.
클래스 패스를 기준으로 클래스를 찾아서 설정을 하게 한다.
3. @ComponentScan
: 지정한 위치 이하에서 있는 @Component 와 @Configuration 이 붙은 클래스를 스캔해서 빈으로 등록
이때 내장 톰캣이 사용된다 기본으로 8080을 사용하게 된다. 다른포트번호로 수정 --> application.properties수정
@Component 어노테이션만 지정하면 클래스의 이름의 첫 글자를 소문자로 한 클래스의 이름이 빈의 이름으로 등록
빈의 매핑 방식은 RequestMapping 에 등록된 메소드가 호출되는 방식 (주소창에서 URL 입력 방식)
▶️ MyController.java
@Controller
public class MyController {
// MyController 클래스를 빈으로 등록
@Autowired
Member member1;
//빈이 생성될때 member1변수가 참조할 객체를 자동으로 가져온다
@Autowired
@Qualifier("printerB")
Printer printer;
@Autowired
Member member2;
@RequestMapping("/")
public @ResponseBody String root() { // get 방식의 url 호출하면 root() 실행 시킴
// @ResponseBody : html 태그없이 순수하게 그대로 스트링 데이터만으로 응답을 할 경우 지정
//1, Member Bean 가져오기
member1.print();
// 2. PrinterB Bean 가져오기
member1.setPrinter(printer);
member1.print();
//3. 싱글톤 확인
if(member1 == member2) {
System.out.println("동일한 객체입니다. ");
} else {
System.out.println("서로 다른 객체입니다. ");
}
return "Annotation 사용하기 ";
}
}
⭐ @ResponseBody
- view가 아닌 JSON 형식의 값을 응답할 때 사용하는 애노테이션으로 문자열을 리턴하면 그 값을 http response header가 아닌 response body에 들어간다.
- 만약 객체를 return하는 경우 JACKSON 라이브러리에 의해 문자열로 변환되어 전송된다.context에 설정된 resolver를 무시한다고 보면된다. (viewResolver)
⭐ @RequestMapping
- 요청 URL을 어떤 메서드가 처리할지 mapping해주는 애노테이션이다.
- 컨트롤러나 컨트롤러의 메서드에 적용한다.
- @RequestMapping("/list"), @RequestMapping("/home, /about");
- @RequestMapping("/admin", method=RequestMethod.GET)
⭐ @Qualifier("id123")
- @Autowired와 같이 쓰이며, 같은 타입의 빈 객체가 있을 때 해당 아이디를 적어 원하는 빈이 주입될 수 있도록 하는 애노테이션 (같은 타입이 존재하는 경우 ex) 동물, 원숭이, 닭, 개, 돼지)
@Autowired
@Qualifier("printerB")
Printer printer;
- printer 객체에 interface (printerA / printerB)
Printer A :Hello홍길동:도사
Printer B: Hello홍길동:도사
동일한 객체입니다.
▶️ Member.java
@Component
public class Member {
@Value("홍길동")
private String name;
@Value("도사")
private String nickname;
@Autowired
@Qualifier("printerA")
// 유사한 객체가 여러개 있을때 빈의 이름으로 정확하게 지정한다
private Printer printer;
public Member() {
}
public Member(String name, String nickname, Printer printer) {
this.name = name;
this.nickname = nickname;
this.printer = printer;
}
public void setName(String name) {
this.name = name;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
public void print() {
printer.print("Hello" + name + ":" + nickname);
}
}
⭐ @Component
: 패키지 스캔 안에 이 어노테이션은 "이 클래스를 정의했으니 빈으로 등록해줘." 라는 뜻이 된다
⇒ 싱글톤 클래스 빈을 생성하는 어노테이션
-
@Scope("Prototype")어노테이션을 통해 싱글톤이 아닌 빈을 생성할 수도 있다. 또한@Service,@Repository 어노테이션 또한 이에 포함
⭐ @Bean
: @Configuration 어노테이션이 들어간 Spring 을 설정하는 클래스 내에 들어가는 메소드에서 선언
⭐ Tip
일반적인 당신의 빈 등록은 간편하게 @Component
어노테이션으로, 유연한 빈 등록이 필요하다면 @Configuration
어노테이션이 들어간 클래스 내 @Bean 어노테이션 메소드 선언으로!
Spring Boot의 경우 @SpringBootApplication
어노테이션이 들어간 스프링 실행부에서도 @Bean 어노테이션이 깃든 메소드 등록이 가능
📌 Web _Basic - JSP 이용하게
1. Static Folder 에 html 파일 생성
2. Spring 에서 JSP 띄우기
- gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
**implementation 'javax.servlet:jstl'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'**
}
- application.properties
sever.port = 8080
#Jsp 설정
spring.mvc.view.prefix = /WEB-INF/views/
spring.mvc.view.suffix = .jsp
- MyController.java
@Controller
public class MyController {
**@RequestMapping("/")**
public @ResponseBody String root() throws Exception {
return "JSP in Gradle";
}
**@RequestMapping("/test1")**
public String test1() {
return "test1";
// 실제 호출됨 /web-inf/views/test1.jsp
// 왜냐면 application.properties에서 경로 지정해줌
}
**@RequestMapping("/test2")**
public String test2() {
return "/sub/test2";
}
}
⭐ @ResponseBody
: 리턴되는 값은 View 를 통해서 출력되지 않고 HTTP Response Body 에 직접 쓰여짐.
- Json 으로 반환
**@RequestMapping("/")**
public @**ResponseBody** String root() throws Exception {
return "JSP in Gradle";
}
이만 오늘 스프링 정리 끝!!

'🌈 Spring Framework > 🌱 Spring-boot' 카테고리의 다른 글
| Lombok 사용시 주의사항 (0) | 2021.05.03 |
|---|---|
| Validator - BindingResult (0) | 2021.02.27 |
| IoC - ApplicationContext / Bean (0) | 2021.02.18 |