Programming/Spring
게시글 조회 화면에서 검색타입, 정렬 방법에 따라 다른 결과를 반환해야 하는 기능을 구현하고 있었다. 단순한 검색 기능이면 스프링 데이터 JPA로 JPQL을 사용했겠지만, 이번 기능은 고려해야 할 부분이 많았기 때문에 Querydsl을 사용해서 구현해 보기로 했다. where문 작성의 경우 BooleanExpression과 BooleanBuilder를 사용해서 간단하게 작성할 수 있었는데, 정렬 조건에 따른 작성을 어떻게 해야 하는지가 문제였다. 처음엔 service단에서 sort값에 따라 처리하도록 아래와 같이 작성했었다. //PostService public Page findPosts(int page, int size, PostSearchDto postSearchDto, String sort) { P..
부트캠프가 끝나고 예전에 수강했던 김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 다시 듣고 있었다. 서블릿 부분을 보던 중 의아한 부분이 있었다. 스프링의 내장 톰캣 서버는 서블릿들을 스캔하여 서블릿 컨테이너에 싱글톤으로 관리하면서 요청마다 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다. 즉, 요청마다 request와 response객체는 요청마다 다른 객체가 만들어져서 servlet을 호출한다고 이해했다. 위와 같이 코드를 작성하고 요청 결과를 확인하다가 request, response가 같은 객체를 사용하고 있는 것을 확인했다. 강의에서는 요청마다 request, response를 생성해서 servlet을 호출한다고 했는데 같은 객체를 사용하길래..
스프링 HttpServletRequest, HttpServletResponse는 RequestContextHolder를 통해 가져오기 ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletResponse response = servletContainer.getResponse(); HttpServletRequest request = servletContainer.getRequest();
스프링은 빈과 연관된 의존관계를 주입할 때 스프링 컨테이너에서 해당 빈을 조회해서 의존관계를 주입한다. 만약, 같은 타입의 빈이 두 개 이상 존재하면 스프링은 의존관계를 주입할 때 어떤 빈을 주입해야 할지 모르기 때문에 애플리케이션은 실행되지 않는다. Animal 인터페이스와 이를 구현한 Cat, Dog 클래스가 있고 AnimalService에서 Animal을 주입받는다고 가정하면 콘솔에 다음과 같이 나온다. Animal package hello.core.animal; public interface Animal {} Cat package hello.core.animal; import org.springframework.stereotype.Component; @Component public class Ca..
스프링 컨테이너 (Spring Container) 스프링 컨테이너는 애플리케이션 내부에서 사용되는 객체들을 관리한다. 정확히는 애플리케이션 빈의 생명주기를 관리하는데 빈 생성, 관리, 제거 등의 역할을 담당하는 곳이다. 객체들의 의존성 또한 관리해주기 때문에 개발자는 모듈 간 의존 및 결합으로 인해 발생하는 문제로부터 자유로워지고 핵심 로직에 집중할 수 있게 된다. 컨테이너는 BeanFactory와 BeanFacotry를 상속받아 사용하는 ApplicationContext가 있다. ApplicationContext가 BeanFactory의 기능에 더해 부가적으로 국제화, 환경변수 등 여러 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용한다. public interface..
스프링은 api요청, 응답에서 발생하는 예외들을 간편하게 처리할 수 있는 애너테이션을 지원한다. 예제로 쓰이는 패키지의 구조는 다음과 같다. @ExceptionHandler @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class
Spring MVC 스프링의 웹 계층을 담당하는 모듈 중에 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈을 spring-webmvc라고 하고 MVC는 각각 Model, View, Controller에 해당한다. Model Spring mvc 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받고 요청 사항을 처리하기 위한 작업을 하는데, 처리하고 클라이언트에게 응답으로 돌려주는 데이터 View Model 데이터를 이용해서 클라이언트 애플리케이션의 화면에 보여지는 리소스를 제공 HTML HTML 페이지에 Model 데이터를 채우고 렌더링 해서 전송 ex) Thymeleaf, FreeMarker,... PDF, Excel Model 데이터를 가공해서 PDF나 Excel 문서를 클라이언트에 전송 X..
스프링 컨테이너에서 관리하는 스프링 빈들의 의존관계를 주입하는 방법은 크게 네 가지가 있다. 생성자 주입 (Constructor Injection) 수정자 주입(Setter Injection) 필드 주입 (field Injection) 일반 메서드 주입 1. 생성자 주입 이름처럼 생성자를 통해 의존 관계를 주입하는 방법 생성자 호출 시점에 딱 1번만 호출되는 것이 보장되기 때문에 불편, 필수 의존관계에 사용된다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Aut..
스프링 빈을 등록하기 위한 방법은 두 가지가 있다. 1. 설정 정보 클래스의 메서드 레벨에 @Bean 사용하기. -> 몇 개 안 되는 스프링 빈을 등록할 땐 괜찮지만, 많은 빈을 등록하게 되면 귀찮고 누락 문제가 발생할 수 있다. 2. ComponentScan 사용하기 ComponentScan @ComponentScan 애너테이션은 @Component 애너테이션이 붙어 있는 클래스를 스캔해서 자동으로 스프링 빈으로 등록해준다. @Configuration 애너테이션이 붙은 설정 정보도 자동으로 등록하는데, @Configuration 애너테이션에도 @Component 애너테이션이 달려있기 때문이다. 이외에도 @Controller, @Service, @Repository를 찾아서 빈으로 등록해준다. @Targ..