Skip to content

Releases: ClothingStoreService/clothstar_v2.0

v2.2.0

22 Jul 14:26
896f5c1
Compare
Choose a tag to compare

⭐ 새로운 기능

  • �GitHub Actions를 활용하여 develop 브랜치 merge할시 자동 배포 구현
  • Member 회원가입시 인증번호 이메일 전송 후 Redis 활용하여 인증번호 검증후 회원가입
  • 카테고리별 조회 기능과 키워드 검색, 정렬 옵션 추가
  • 주문 CRUD 기능과, 주문 목록 페이징 구현

⭐ 구조 변경

  • 기존 Mybatis 레거시 제거 및 JPA 클래스 네이밍 변경
  • JPA 클래스 네이밍 변경

⭐ 트러블 슈팅

✈️ Pagination에서 fetchjoin 성능 문제 및 N+1 해결

Pagination에서 N+1 해결을 위해 FetchJoin을 사용할 경우 야기되는 성능 문제를 해결했습니다.

What's Changed

  • Refactor/remove mybatis by @Ogu1208 in #82
  • feat: test job 추가 by @hjj4060 in #84
  • feat: test code 실패시 merge안되는지 확인 by @hjj4060 in #85
  • Feature/cicd modify and test by @hjj4060 in #86
  • Feature/signup email verify by @hjj4060 in #68
  • Feature/member findall paging by @hjj4060 in #65
  • hotfix: DB 컬럼 변화에 따른 오류 발생 수정 by @axhtl in #88
  • Refactor/#6 add order inquery by @axhtl in #75
  • Refactor/order by @axhtl in #80
  • refactor: Entity->domain 으로 변경 by @hjj4060 in #89
  • Feature/product line list by @Ogu1208 in #83
  • Feature/category product pagination by @Ogu1208 in #92
  • Refactor/product line cactegory pagination by @Ogu1208 in #93
  • refactor : 서비스 로직을 이용하여 주문 조회 구현 by @axhtl in #91
  • Refactor/#95 order design by @axhtl in #96
  • Refactor/#97 order cascade by @axhtl in #101
  • Test/order integration test by @axhtl in #105
  • hotfix: saveOrder() 테스트코드 오류 수정 & 구매자 주문 취소 기능 오류 수정 by @axhtl in #106
  • Refactor/pagination response by @Ogu1208 in #94
  • feat: 권한 hierarchy 적용 by @hjj4060 in #108
  • Refactor/product line paging class name by @Ogu1208 in #104
  • Mybatis 제거, 각 도메인 및 기능 고도화 by @Ogu1208 in #109

Full Changelog: v2.1.0...v2.2.0

v2.1.0.

03 Jul 16:13
1430814
Compare
Choose a tag to compare

⭐ 새로운 기능

  • 1차 프로젝트 레포지토리를 복사하여 2차 프로젝트 레파지토리 생성.
  • SpringBoot 3.2, SpringSecurity 6.2 버전 업그레이드 #21
  • JPA, QueryDSL 의존성 추가 #26
  • Member, Seller, Address 도메인 어댑터패턴 사용하여 Mybatis 기능에서 JPA 전환 #18
  • Product, Product Option, Category 도메인 어댑터패턴 사용하여 Mybatis 기능에서 JPA 전환 #24
  • Order 도메인 어댑터패턴 사용하여 Mybatis 기능에서 JPA 전환 #30
  • OrderDetail, OrderSeller 도메인 어댑터패턴 사용하여 Mybatis 기능에서 JPA 전환 #29
  • Github Actions 사용한 자동배포 기능 구현#50
  • Github Actions 자동배포 디스코드 알림 설정 #60
  • Order 도메인 기존 마이바티스 코드 제거 #67
  • Category, ProductLine, Product 도메인 JPA 전환 Adapter 패턴, ReposigoryConfig, profiles 어노테이션을 통해 구현 #81

📗 MyBatis -> JPA 전환 과정

SOLID 원칙과 디자인패턴을 적용하여 JPA 전환을 시도하였습니다. 그리하여 퍼시스턴스 계층의 변환(JPA/Mybatis)에 따른 다른 계층에 코드 변경이 일어나지 않도록 설계했습니다.
모든 도메인에서 MyBatis -> JPA 전환을 진행하였습니다. 그 중 대표적으로 Product와 Category 도메인의 JPA 전환 방법을 기술합니다.

Product

Product 도메인의 Mybatis -> JPA 변환 과정은 다음과 같습니다.

  1. Entity 클래스 생성
  2. JPA Repository 생성
  3. JPA, Mybatis Repoisotry 호환 작업
    • 공통 상속 클래스 ~Repository 생성
    • JPA Adapter 클래스 구현 (implements ~Repository)
    • Mybatis Repository extends ~Repository)
  4. RepositoryConfig + @Primary 어노테이션 + yml 설정을 통한 Mybatis/JPA 설정
  5. Service 레이어 수정 (Repository 의존성을 ~Repoisitory 로 주입)
  6. 테스트 코드 수정 및 검증
app:
  repository:
    type: mybatis  # 또는 jpa
@Slf4j
@Configuration
@RequiredArgsConstructor
public class RepositoryConfig {

    @Bean
//    @Primary
    @ConditionalOnProperty(name = "app.repository.type", havingValue = "jpa", matchIfMissing = true)
    public ProductLineRepository jpaProductLineRepository(CategoryJpaRepository categoryJpaRepository,
                                                          SellerRepository sellerRepository,
                                                          ProductLineJPARepository productLineJPARepository,
                                                          ProductJPARepository productJPARepository) {
        log.info("Configuring ProductLine JPA repository");
        return new ProductLineJPARepositoryAdapter(categoryJpaRepository, sellerRepository, productLineJPARepository, productJPARepository);
    }

    @Bean
    @Primary
    @ConditionalOnProperty(name = "app.repository.type", havingValue = "mybatis")
    public ProductLineRepository mybatisProductLineRepository(SqlSessionTemplate sqlSessionTemplate) {
        log.info("Configuring ProductLine MyBatis repository");
        return sqlSessionTemplate.getMapper(ProductLineMybatisRepository.class);
    }
    @Bean
//    @Primary
    @ConditionalOnProperty(name = "app.repository.type", havingValue = "jpa", matchIfMissing = true)
    public ProductRepository jpaProductRepository(ProductJPARepository productJPARepository, ProductLineJPARepository productLineJPARepository) {
        log.info("Configuring Product JPA repository");
        return new ProductJPARepositoryAdapter(productJPARepository, productLineJPARepository);
    }

    @Bean
    @Primary
    @ConditionalOnProperty(name = "app.repository.type", havingValue = "mybatis")
    public ProductRepository mybatisProductRepository(SqlSessionTemplate sqlSessionTemplate) {
        log.info("Configuring Product MyBatis repository");
        return sqlSessionTemplate.getMapper(ProductMybatisRepository.class);
    }
}

Category

Category 도메인의 Mybatis -> JPA 변환 과정은 다음과 같습니다.

  1. Entity 클래스 생성
  2. JPA Repository 생성
  3. JPA, Mybatis Repoisotry 호환 작업
    • 공통 상속 클래스 ~Repository 생성
    • Mybatis ,JPA Adapter 클래스 구현 (implements ~Repository)
    • Mybatis Repository extends ~Repository)
  4. Adapter 클래스의 Profiles 설정, yml 설정을 통한 Mybatis/JPA 설정
    • @Profile("mybatis"), @Profile("jpa")
  5. Service 레이어 수정 (Repository 의존성을 ~Repoisitory 로 주입)
  6. 테스트 코드 수정 및 검증

application.yml

spring:
  profiles:
    active:
      - local, mybatis
    group:
      local:
        - db-local
        - db-local-jpa  # 또는 db-local-jpa
      dev:
        - db-dev
        - db-dev-jpa  # 또는 db-dev-jpa
    include:
      - db

application-db.yml

--- # local 공통 설정
spring:
  config:
    activate:
      on-profile: "db-local"
  datasource:
    url: jdbc:h2:mem:localdb
  h2:
    console:
      enabled: true
  thymeleaf:
    cache: false

--- # local - MyBatis 활성화
spring:
  config:
    activate:
      on-profile: "db-local-mybatis"
  mybatis:
    mapper-locations: classpath:/mappers/**.xml
    config-location: classpath:/config/mybatis-config.xml

--- # local - JPA 활성화
spring:
  config:
    activate:
      on-profile: "db-local-jpa"
  jpa:
    show-sql: true
    database-platform: H2
    properties:
      hibernate:
        format_sql: true
        default_batch_fetch_size: 100

--- # dev 공통 설정
jasypt:
  encryptor:
    bean: jasyptStringEncryptor

spring:
  config:
    activate:
      on-profile: "db-dev"
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ENC(tdT8e3e+B4Lnbjjca9DuylTI2WMxolkaTxUyT4yJKbFLHUV0YynNjMss5AsaQJxEyndmGmgUlYTuJhx6667fcyUxGiV43314vgEwX+/NaVaSjIa2wiAmMfZu3WPVlgp/)
    username: ENC(xhLiaQAS5lcTT2hgCMRDOw==)
    password: ENC(XzhtQOZIlb9QjMX3klXi1EMBAuVOqWrM)

--- # dev - MyBatis 활성화
spring:
  config:
    activate:
      on-profile: "db-dev-mybatis"
  mybatis:
    mapper-locations: classpath:/mappers/**.xml
    config-location: classpath:/config/mybatis-config.xml

--- # dev - JPA 활성화
spring:
  config:
    activate:
      on-profile: "db-dev-jpa"
  jpa:
    show-sql: true
    database-platform: org.hibernate.dialect.MySQLDialect
    properties:
      hibernate:
        format_sql: true
        default_batch_fetch_size: 100

What's Changed

  • Feature/build modify by @hjj4060 in #5
  • Hotfixes/security error modify by @hjj4060 in #14
  • chore: DB 설정을 환경 변수로 전환 by @Ogu1208 in #17
  • fix: security 설정 버전업데이트 에러 수정 by @hjj4060 in #21
  • Refactor/order test by @axhtl in #19
  • refactor: jpa mybatis 어댑터 형식 전환 by @hjj4060 in #18
  • chore: QueryDSL 의존성 추가, Config 클래스 추가 by @Ogu1208 in #26
  • refactor: address, seller 엔티티 생성 by @hjj4060 in #28
  • feat: 로그인 실패 메시지, 권한 없는 페이지 접근시 메시지 구현 by @hjj4060 in #25
  • Feature/#13 convert mybatis to jpa entity repository by @Ogu1208 in #24
  • feat: Product 옵션 JPA Repository 생성 by @Ogu1208 in #32
  • Feature/member domain refactor by @hjj4060 in #33
  • fix: QueryDSL 빌드 버그 수정 by @axhtl in #34
  • fix: OrderServiceTest 오류 수정 by @axhtl in #35
  • fix: SellerServiceApplicationMockUnitTest - getSellerUnitTest 오류 수정 by @axhtl in #36
  • refactor: test yml 생성 by @hjj4060 in #37
  • feat: 판매자 주문 취소 시, 상품 재고 롤백 by @axhtl in #27
  • OrderDetail & OrderSeller - JPA 변환, 테스트코드 수정 by @axhtl in #29
  • Order - JPA 변환, 테스트코드 수정 by @axhtl in #30
  • Feature/member address seller unittest by @hjj4060 in #38
  • test: 테스트 코드 수정 by @hjj4060 in #41
  • chore/deploy.yml create by @hjj4060 in #42
  • feat:CI/CD s3 upload by @hjj4060 in #43
  • feat:CI/CD s3 ec2 deploy by @hjj4060 in #44
  • chore: deploy.yml 에러수정 by @hjj4060 in #45
  • chore: deploy.yml 에러수정 by @hjj4060 in #46
  • feat: ec2 deploy by @hjj4060 in #47
  • chore: deploy error 해결 by @hjj4060 in #48
  • chore: test용 테스트코드 by @hjj4060 in #49
  • Feature/cicd modify and test by @hjj4060 in #50
  • Feature/cicd aws deploy#4 by @hjj4060 in #51
  • chore: testcode 수정 by @hjj4060 in #52
  • chore: deploy 수정 by @hjj4060 in #53
  • chore: deploy 수정 by @hjj4060 in https://github...
Read more