Programming
게시글 조회 화면에서 검색타입, 정렬 방법에 따라 다른 결과를 반환해야 하는 기능을 구현하고 있었다. 단순한 검색 기능이면 스프링 데이터 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..
JWT와 redis를 이용해서 토큰 재발급 로직을 작성하다 만난 에러 public void reIssue(AuthRequestDto.ReIssue reIssue, HttpServletResponse response) { //Refresh Token 검증 if (!jwtTokenProvider.validateToken(reIssue.getRefreshToken())) { throw new BusinessLogicException(ExceptionCode.INVALID_TOKEN); } String accessToken = jwtTokenProvider.resolveToken(reIssue.getAccessToken()); //AccessToken으로 Authentication 생성 Authenticatio..
Spring Security 인증 처리 과정 - 로그인 요청 - AuthenticationFilter에서 username과 password로 Authentication(인증되지 않은) 객체 생성 - Authentication 객체를 AuthenticationManager에 전달 AuthenticationManager는 인증 처리 역할을 하는 인터페이스, 인증을 위한 실질적인 관리는 AuthenticationManager를 구현하는 클래스 (ProviderManager) 를 통해 이루어짐 - ProviderManager로부터 전달받은 Authentication을 AuthenticationProvider는 UserDetailsService를 이용해 UserDetails 조회 - AuthenticationPr..
JPA는 엔티티라는 객체를 이용해서 데이터를 관리하고 관계형 데이터베이스는 테이블을 이용해 데이터를 관리한다. 관계가 없는 테이블은 컬럼과 엔티티의 필드를 매핑해서 작성하지만, 서로 관련 있는 엔티티들의 경우엔 관계형 DB에서 사용하는 외래키와 같은 연관관계를 매핑해주어야 한다. 엔티티를 관계형 DB의 테이블처럼 작성하면 다음과 같다. @Getter @Setter @Entity public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long memberId; private String name; } @Getter @Setter @Entity(name = "ORDERS") public class Order { @Id @Gen..
영속성 컨텍스트(Persistence Context) 영속성이란 지속성이라는 뜻을 가지고 있다. 즉, 데이터를 지속적으로 관리한다라는 목적을 가지고 있다. JPA(Java Persistence API)에도 Persistence가 들어가는데 그만큼 영속성의 개념이 중요한 개념으로 사용된다. JPA는 자바에서 사용하는 ORM 기술의 스펙이고 DB와 객체를 매핑한 뒤 영속성 컨텍스트를 통해 관리하게 된다. 영속성 컨텍스트는 논리적인 개념이고 EntityManagerFactory가 생성한 EntityManager를 통해 접근할 수 있다. 엔티티의 생명 주기 영속성 컨텍스트가 관리하는 엔티티의 생명주기는 비영속, 영속, 준영속, 삭제로 관리된다. 비영속 (new/transient) Member member = n..