본문 바로가기

🌈 Spring Framework/🌱 Spring-boot

@SpringBootApplication

@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

'🌈 Spring Framework > 🌱 Spring-boot' 카테고리의 다른 글

Lombok 사용시 주의사항  (0) 2021.05.03
Validator - BindingResult  (0) 2021.02.27
IoC - ApplicationContext / Bean  (0) 2021.02.18