공부/스프링프레임워크

[spring] 스프링 부트 레퍼런스 정리

ghhong 2022. 5. 9. 16:21

spring boot starter
: 편리하게 의존성 추가, 예를들어 spring boot starter data jpa를 추가하면 관련 의존성이 자동으로 추가.
의존성들의 충돌을 방지하여 관련된 의존성들을 추가함

서드파티는 spring-boot로 시작하면 안 된다. 공식적인 것임.
createing your own starter :  starter모듈은 autoconfigure모듈을 포함해야 한다 -> 추가하면 모든 라이브러리를 사용할 수 있게끔 해야한다.
configuration할 때 사용하는 키를 사용하지마라. such as server, management, spring(application.yml에 있는 애들)
dependency를 optional하게 추가해라(있으면 쓰고 없어도 돼). 근데 많이 쓰지마라 
ex-> 소스코드 안에서 의존성이 있으면~를 쓰고 없으면 기본제공하는 ~를 써라~
내가 만든 서드파티 스타터를 해도 걔네는 어차피 spring boot starter(core 스타터)를 사용한다.

structuring your code
스프링부트는 특정한 코드 구조를 강요하지 않는다. 
다만 디폴트 패키지 사용하지마. 여기에 @ComponentScan,@EntityScan,@SpringBootApplication을 사용하면
하위 모든 클래스를 검사/스캔하기 때문에 성능에 영향이 있어. 패키지를 만들어서 써야 그 범위만 스캔해

locating the main application class
메인메서드 위치 : 루트패키지에 둬라. @EnablaAutoConfiguration 어노테이션을 여기에 쓰고, 그 밑의 @Entity를 사용한 클래스를 스캔하기 때문

configuration classes
스프링부트는 자바기반 configuration을 선호한다. 물론 xml도 가능하지만 자바설정 xml설정 둘 다 쓰면 하나를 메인으로 써야해(자바를선호)
@Configuration 클래스 하나 쓰는게 좋고, main을 포함한 클래스에 적용하는걸 선호하지만, 동등한 수준의 클래스에 적용해도 돼
import additional configuration classes
자바설정파일 하나만 쓸 필요는 없다. @configuration달린 애들은 @componentscan으로 읽어들일 수도 있다. @import 어노테이션으로도 가능하다.
(@SpringBootApplication 안에 @ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 들어있음)
--> 메인클래스에 @componentscan -> 패키지 내에 @configuration이 있는 클래스에 @Bean인 클래스있으면 걔도 등록됨.
-> 또는 @Service, @Component, @Repository, ...으로 된 애들도 scan된다.

import XML Configuration
XML기반 환경설정을 사용하기 보단 @Configuration를 사용을 추천. 그렇게 되면 @ImportResource 어노테이션을 이용해서 XML환경설정파일을 로드할 수 있다.

Auto-configuration
springboot autoconfiguration은 우리가 추가한 jar 의존성들을 기반으로 스프링 애플리케이션을 자동으로 환경설정하기를 시도한다. 
예를 들어 클래스패스에 HSQLDB를 놓으면 수동으로 데이터베이스 커넥션 빈을 설정하지 않더라도 스프링부트는 in-memory database를 자동으로 환경설정한다.
autoconfiguration을 사용하려면 @EnableAutoConfiguration 이나 @SpringBootApplication 어노테이션을 @Configuration클래스에 넣어주면 된다.

Gradually Replacing Auto-Configuration
autoconfiguration은 비침투적이다(반드시 해야할 필요는 없다). 어느 순간이 되면 자동설정되는 부분을 어느정도 대체하여 자신만의 환경설정을 사용해야 하는 순간이 올 것이다.
예를 들어, 개인적인 DataSource 빈을 등록하게 된다면, 자동으로 제공되는 embedded 데이터베이스는 사라진다.
어떤 autoconfiguration이 적용되어있는지, 왜 적용되어있는지 알고 싶으면 --debug를 사용하여 애플리케이션을 실행(java -jar ~~.jar --debug)하면 된다. 그렇게 하면 콘솔에 debug로그(condition report)가 출력된다.

Disabling Specific Auto-configuration Classes
특정한 autoconfiguration을 사용할 필요가 없다면 @EnableAutoConfiguration 에 exclude 애트리뷰트를 추가하여 disable할 수 있다.@SpringBootApplication에 추가해도 됨.
해당 클래스가 classpath에 없다면 excludeName 애트리뷰트를 사용할 수도 있다.
다른 방법으로는 spring.autoconfigure.exclude 프로퍼티에 추가하면 제외시킬 수 있다.

Spring Beans and Dependency Injection
스프링 프레임워크가 지원하는 모든 기술로 빈을 정의하고 의존성 주입을 할 수 있다.
간단히 말해, @ComponentScan 이나 @Autowired 사용 잘 된다.
제안하는 대로 구조를 잡는다면(루트 패키지 밑에 애플리케이션 클래스 위치시키는 것), @ComponentScan을 arguments없이 설정할 수 있다.
그리고, @Component, @Service, @Repository, @Controller 등과 같은 어노테이션을 갖고 있는 애들은 자동으로 빈 등록 될 것이다.
Bean이 하나의 생성자를 갖고 있다면 @Autowired는 생략할 수 있다. ->(생성자 주입)

@SpringBootTest를 사용하면 메인클래스를 지정하지 않아도 된다.

Using the @SpringBootApplication 
@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan (완전히 같지는 않음.. ComponentScan에 excludeFilters가 빈으로 등록되면 안되는 애들 추가돼있음)

Running Your Application
jar로 패키징하고 embedded HTTP server를 사용하는 것은 다른 사람들이 사용하는 방법으로 동일하게 사용할 수 있다는 장점이 있다.
스프링 부트 애플리케이션을 디버깅하는 것 또한 쉽다. 다른 IDE 플러그인이나 확장프로그램이 필요없다.

Running as a Packaged Application
스프링 부트 메이븐이나 그레이들 플러그인을 사용하여 executable jar를 생성하면, 애플리케이션을 java -jar 로 실행할 수 있다.
java -jar target/myapplication-0.0.1-SNAPSHOT.jar
또한 패키징된 애플리케이션을 remote debugging support enabled로 실행할 수 있다. 원격에서 돌고있는 스프링부트 애플리케이션을 나의 로컬에서 디버깅할 수 있다.
*힙 최대값, 최소값을 같은 값을 주는 것이 좋다고 한다. -Xmx -Xms 조정하는 부분

Hot Swapping(작동중인 시스템을 끄지 않고 문제가 있는 장치를 교체하는 것.)
스프링 부트 애플리케이션은 자바 애플리케이션이기 때문에 JVM이 제공하는 hot-swapping이 가능하다. 하지만 바이트코드만 스왚가능하다. 추가적으로 하려면 JRebel 사용.
spring-boot-devtools 모듈은 quick application restart 를 지원한다.

Developer Tools
spring-boot-devtools를 추가하면 개발시간을 줄이는데 유용한 기능을 제공한다. (optional을 true로 추가하면 내 프로젝트를 추가한 다른 프로젝트에는 추가가 안 된다.(그레이들은 지원 X))
Developer Tools는 fully packaged application에서는 자동으로 disabled된다. java -jar로 실행되면 production모드로 인식해서 자동으로 꺼지는 것이다. 
제공 기능 : Property Defaults, Automatic Restart, Live Reload, Global Settings, Remote Applications
원격 디버깅을 하고싶다면 리패키징할 때 devtools를 포함시켜야하지만 권장하지는 않는다.

Developer Tools - Property Defaults
스프링부트의 몇몇 라이브러리들은 성능향상을 위해 캐시를 사용한다. 예를 들어, 템플릿 엔진에서 매번 컴파일하지 않고 캐시를 사용한다. 이러한 캐싱이 개발중에는 오히려 불편할 수 있다.
그러한 이유로 spring-boot-devtools는 캐시 옵션을 기본적으로 비활성화시킨다. 패키징할땐 빠지니까 상관 없다. 
캐시 옵션을 원래는 프로퍼티(apllication.properties파일)에 설정해줬어야한다.
*static resource들은 resources/static/ 에 넣어두면 알아서 인식. ex) index.html을 넣어두면 mapping 안 해도 찾아감

Developer Tools - Automatic Restart
클래스패스 파일들이 바뀔때마다 재시작한다. 매우 빠르게 코드 변경 사항을 피드백 받을 수 있다.(스태틱 리소스는 재시작할 필요 없다.) 이클립스는 저장할 때마다 클래스패스가 변경되고 인텔리제이는 빌드해야 변경됨.