Spring Framework/SpringBoot

@Async스프링에서는 @Async 어노테이션을 사용하면 비동기로 메서드를 호출할 수 있다.@Async 어노테이션은 Spring AOP로 동작하며 요청 스레드와 별개의 스레드에서 해당 메서드를 비동기로 수행할 수 있게 한다. ThreadPoolTaskExecutor 빈 등록@EnableAsync 어노테이션도 같이 붙여야 @Async가 동작한다.근데 왜 ThreadPoolTaskExecutor 빈을 등록하라는 걸까?  기본적으로 @EnableAsync 어노테이션을 사용하면 TaskExecutor 타입의 빈을 찾고 해당 빈을 통해 비동기를 처리한다.만약 개발자가 직접 커스텀하게 등록한 TaskExecutor 빈이 존재하지 않으면 디폴트로 SimpleAsyncTaskExecutor를 사용하게 되는데, Simp..
@Transactional 어노테이션과 @PostContruct 어노테이션을 함께 사용하면 @Transactional 어노테이션이 적용되지 않는다.초기화가 먼저 일어난 이후 트랜잭션 AOP가 동작하기 때문이다. @SpringBootTestpublic class InitTxTest { @Test public void test() throws Exception { System.out.println("TEST"); } @TestConfiguration static class InitTxTestConfig { @Bean Hello hello() { return new Hello(); } } static c..
스프링에서는 @Transactional 어노테이션이 붙은 메서드가 진짜 객체에서 호출하는지, 프록시 객체에서 호출하는지 판단해서 로직을 작성하는 것이 중요하다. 아래의 잘못된 테스트 코드를 살펴보고 트랜잭션이 적용되지 않는 원인을 알아보도록 하자. @SpringBootTest public class InternalCallV1Test { @Autowired CallService callService; @Test public void printProxy() throws Exception { System.out.println("callService = " + callService.getClass()); } @Test public void internalCall() throws Exception { callSe..
두 가지의 예외 상황을 통해 인터셉터의 afterCompletion 메서드와 ExceptionResolver 작동여부 확인해보겠습니다. 상황 1. 컨트롤러에서 RuntimeException이 발생 @RequestMapping(value = "/error-test", method = RequestMethod.GET) public void errorTest(HttpServletRequest req) { throw new NullPointerException("NPE 발생"); // RuntimeException을 상속받은 Exception } 1번 상황에서는 ExceptionResolver가 작동하고 afterCompletion에는 Exception 객체에 null이 반환됩니다. @Override publi..
메시지 컨버터는 5, 7번 과정에서 실행된다.
안녕하세요. 이번 포스팅은 스프링부트에서 정적 리소스 처리를 위한 설정 방법을 알아보겠습니다. 스프링부트는 기본적으로 4가지 경로에 정적파일이 위치했을 때 정적 리소스를 자동으로 반환을 해주도록 설정이 되어 있습니다. classpath:/static classpath:/resources classpath:/public classpath:/META-INF/resources 아래 디렉터리 구조로 정적 리소스 반환이 되는지 테스트를 해보겠습니다. hello1.html은 스프링부트에서 기본적으로 제공하는 경로가 아니라 정적 리소스 반환이 되질 않아 에러가 발생합니다. hello2.html도 스프링부트에서 기본적으로 제공하는 경로가 아니라 정적 리소스 반환이 되질 않아 에러가 발생합니다. hello3.html은 ..
안녕하세요. 이번 포스팅은 스프링에서 원활하게 예외처리를 할 수 있도록 제공해주는 ExceptionResolver에 대해 알아보겠습니다. 스프링에서 예외가 발생하면 서블릿을 넘어 WAS까지 예외가 전달되며 HTTP 상태코드가 500으로 처리됩니다. 하지만, 발생하는 예외에 따라서 400, 401, 403, 404 등으로 각각 처리해야 하는 경우도 존재합니다. 이럴 때 HandlerExceptionResolver 인터페이스를 활용함으로써 각 예외마다 원하는 HTTP 상태코드를 지정할 수 있습니다. HandlerExceptionResolver 인터페이스를 구현하고 resolveException 메서드를 오버라이딩하여 커스터마이징을 하면 됩니다. 하지만 굳이 커스터마이징을 할 필요없이 스프링에서는 3가지의 E..
안녕하세요. 이번 포스팅에서는 Connection Pool, DataSource에 대해 알아보겠습니다. JDBC와 DriverManager에 관한 개념은 이전 글에서 확인이 가능합니다. 데이터베이스 커넥션을 획득할 때는 아래와 같은 복잡한 과정을 거칩니다. 1. DB 드라이버를 통해 커넥션을 조회 시도 2. DB 드라이버는 DB와 TCP/IP 커넥션 연결(3 way handshake 발생) 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW 등 DB에 정보를 전달 4. DB는 받은 정보로 내부 인증을 완료하고 내부에 DB 세션을 생성 후 커넥션 생성 완료 응답을 보냄 5. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환 SQL문을 실행하여 데이터베이스와 통신을 할 때 한 번씩 커넥션..
ctp102
'Spring Framework/SpringBoot' 카테고리의 글 목록