[이커머스 프로젝트] 주문 로직 - 전략 패턴 적용(리팩토링)
·
Web/Spring Boot
초기 코드현재 주문로직은 상품을 직접 주문하는경우와 장바구니의 상품을 주문하는 경우로 나뉘어있다.상품을 직접 주문할때는 수량을 선택하여 주문하지만장바구니에 담긴 상품을 주문할때는 장바구니에 담긴 수량만큼 주문하기위해 나눠놓았다public Order createOrderByProduct(CreateOrderByProductRequest request, Member member) throws CustomException { Address address = addressQueryService.getAddress(request.getAddressId()); Order order = Order.createByProduct(request, member, address); ProductVariant ..
[이커머스 프로젝트] 상품 옵션 검증 로직 (리팩토링)
·
Web/Spring Boot
초기 코드/* request 에 categoryOption 이 누락되었는지 검증 */private void validateProductRequestContainsNeedOptions(CreateProductRequest request) throws CustomException { List categoryOptions = categoryOptionService.getCategoryOption(request.getCategoryId()); Set needOptionIdSet = categoryOptions.stream() .map(CategoryOption::getId) .collect(Collectors.toSet()); requ..
[Spring Boot] Redis Cache - 1
·
Web/Spring Boot
프로젝트에 캐시를 적용하기위해 redis를 사용하기로 하였다.Redis 기본설정build.gradle 의존성 추가implementation 'org.springframework.boot:spring-boot-starter-data-redis' yml 설정spring: data: redis: host: localhost port: 6379 @Configurationpublic class RedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Bean public RedisConnectionFactory redisCo..
[Spring Boot] QueryDsl 적용기 - 1
·
Web/Spring Boot
QueryDsl이란querydsl은 sql, jpql등 Java 코드로 작성할수있게 해주는 프레임워크이다 QueryDsl 동작 과정jqpl은 개발자가 직접 문자열 형식으로 jqpl을 작성하여 entity manager에게 전달한다.querydsl을 사용하게된다면 개발자는 java코드로 querydsl 문법에 맞게 작성한뒤 요청한다. 그리고 querydsl이 자동으로 jpql을 작성하여 entity manager에게 요청을 보내는 방식이다.JPQL vs QueryDsljpql(문자열) - querydsl(코드)jpql은 문자열로 동적쿼리를 생성하기 불편하고 타입 안정성이 떨어진다. 그에반해 querydsl은 java 코드로 동작하므로 컴파일시 에러를 체크할수있고 타입 안정성 측면에서 뛰어나다.QueryDs..
[Spring Boot] OAuth2와 Spring Security 로그인 같이 사용할때의 문제점
·
Web/Spring Boot
문제점 발견프로젝트를 개발하면서 OAuth2와 일반 Security 로그인을 같이 사용하면서 문제가 생겼다. @AuthenticationPrincipal 어노테이션을 이용해 현재 로그인된 사용자 정보가 필요한때 소셜로그인과 Security 로그인 사용자의 반환되는 객체가 달라서였다. OAuth2를 사용하는 사용자는 OAuth2User 객체, Security 로그인을 사용하는 사용자는 UserDetails 객체를 반환하여 생기는 문제였다. 그렇다면 어떻게 해결할수있나해결방법현재 개발하는 프로젝트에서는 OAuth2User와 UserDetails를 상속하는 PrincipalDetails 클래스를 만들어서 해결하였다.@Datapublic class PrincipalDetail implements UserDeta..
[Spring Boot] Abstract Class로 Entity, Service 구현, (슈퍼-서브 타입)
·
Web/Spring Boot
개인 프로젝트 진행 중에 여러 종류의 게시판을 사용하게 되었다.초기에 각각 게시판마다 엔티티와 서비스를 구현함에 있어 문제점들이 보이기 시작하였다.문제점각각 게시판마다 댓글 엔티티 따로 구현해줘야 함반복(공통)되는 항목들이 많음 Entity따라서 공통되는 부분들을 하나로 통합하고자 추상 클래스로 변경하기로 하였다.JPA에서 슈퍼-서브 타입 모델을 구현하기 위해선 @Inheritance(strategy = InheritanceType.JOINED)어노테이션으로 전략을 정해주어야 한다.  JOINED : 조인 전략 (권장) SINGLE_TABLE : 단일 테이블 전략 (기본)TABLE_PER_CLASS : 구현 클래스마다 테이블 생성 전략 (추천X)JOINED각각 테이블을 생성하고 조인하는 전략JPA가 자동..
[게시판] 2 - Security 기본 설정 (CSRF와 CORS)
·
Web/Spring Boot
SecurityConfig @EnableWebSecurity @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .csrf(csrf -> csrf.disable()) .cors(cors -> cors.disable()) .authorizeHttpRequests((auth) -> auth .requestMatchers(new AntPathRequestMatcher("/**")).permitAll() ); return http.build(); } } 나중에 필요할시 설정하기위해 임시로 csrf와 cors를 비활성화 해주고 모든..
[게시판] 기본설정
·
Web/Spring Boot
버전정보 자바 - 17 스프링부트 - 3.2.1 mysql - 8.0 Dependency implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity..
Junyoung.dev