<aside>
</aside>
Spring Boot는 기본적인 설정을 자동으로 해줍니다. 예를 들어, Spring Boot는 application.properties 또는 application.yml 파일을 통해 데이터베이스 연결, 웹 서버 설정 등 여러 가지 설정을 자동으로 처리합니다. 덕분에 개발자는 필요한 의존성만 추가하면 대부분의 설정을 따로 하지 않아도 됩니다.
스프링 프레임워크를 쓴다면? https://github.com/Sunro1994/TravelMaker/blob/main/TravelMaker/src/main/webapp/WEB-INF/web.xml
Spring Boot는 Tomcat, Jetty, Undertow와 같은 서버를 내장하고 있어 별도의 외부 서버 설정 없이 애플리케이션을 실행할 수 있습니다. java -jar 명령어만으로 애플리케이션을 실행할 수 있는 것이 큰 장점입니다.
Spring Boot 애플리케이션의 실행은 @SpringBootApplication 어노테이션이 붙은 메인 클래스로 시작합니다. 이 클래스에서 SpringApplication.run()을 호출하여 애플리케이션을 실행할 수 있습니다.
Spring Boot는 다양한 스타터 의존성을 제공하여, 필요한 기능을 쉽게 추가할 수 있습니다. 예를 들어, spring-boot-starter-web은 웹 애플리케이션을 위한 기본 설정을 제공합니다. 이처럼 필요한 기능을 starter 의존성만 추가하면 자동으로 설정이 처리됩니다.
<aside>
</aside>
cf. MessageConverter란?
JSON 데이터를 HTTP 메시지 바디안에 직접 읽거나 쓰는 경우 사용함
사용 예시 :
@RestController를 이루는 어노테이션 @ResponseBody은 자바 객체를 json으로 바꾸는 역할을 하는데,
이때 @ResponseBody의 내부에서 HttpMessageConverter가 동작함
<aside>
</aside>
Bean Factory
ApplicationContext
MessageSource
: 메시지 다국화를 위한 인터페이스EnvironmentCapable
: 개발, 운영, 환경 변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리ApplicationEventPublisher
: 이벤트 관련 기능 제공ResourceLoader
: 파일, 클래스 패스 등 리소스를 편리하게 조회스프링 컨테이너
를 사용하는걸까?결합도는 낮추고, 높은 캡슐화
를 위해 스프링 컨테이너가 사용된다. (DI, IoC
)public class SingletonTest {
private static ApplicationContext context;
@BeforeClass
public static void init() {
context = new ClassPathXmlApplicationContext(
"classpath:META-INF/spring/applicationContext.xml");
}
@Test
public void testInstances() {
FixedDepositController controller1
= (FixedDepositController)context.getBean("controller");
FixedDepositController controller2
= (FixedDepositController)context.getBean("controller");
assertSame("Different FixedDepositController instances", controller1,controller2);
}
...
}
<aside>
</aside>
<aside>
</aside>
ava로 DB와 통신을 구현하기 위해서는 먼저 DB Connection을 맺어야합니다. 그리고 트랜잭션을 시작합니다. 쿼리를 실행하고 결과에 따라 Commit 또는 Rollback을 하게됩니다. 마지막으로 DB Connection을 종료하며 마무리하게 됩니다. 이를 Java의 수도코드로 나타내면 아래와 같습니다.위 예제의 3번을 제외하고는 @Transactional
에서 제어해주는 부분입니다. 3번은 우리가 직접 구현하는 비지니스 메서드가 될 것입니다.
public void method_name() throw Exception {
// 1. DB Connection 생성
// 2. 트랜잭션(Transaction) 시작
try {
// 3. DB 쿼리 실행
// 4. 트랜잭션 커밋
} catch(Exception e) {
// 5. 트랜잭션 롤백
throw e;
} finally {
// 6. DB Connection 종료
}
}
만약 JDBC로 @Transactional
이 되어있다면 아래와 같은 코드가 될 것입니다. 이것은 JDBC에 특화되어있는 코드입니다. 이 코드로는 JPATransactionManager는 이용할 수가 없습니다. 왜냐하면 JPA는 Connection을 직접관리하지 않고 EntityManager로 간접으로 관리하기 때문입니다. Hibernate 라면 Session으로 관리하죠. 변경을 위해서는 코드의 수정이 불가피한 상황입니다. 어떻게 해야 @Transactional
단일 어노테이션으로 JPATransactionManager도 사용할 수 있게 할 수 있을까요?