Releases: ClothingStoreService/clothstar_v2.0
Releases · ClothingStoreService/clothstar_v2.0
v2.2.0
⭐ 새로운 기능
- �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.
⭐ 새로운 기능
- 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 변환 과정은 다음과 같습니다.
- Entity 클래스 생성
- JPA Repository 생성
- JPA, Mybatis Repoisotry 호환 작업
- 공통 상속 클래스
~Repository
생성 - JPA Adapter 클래스 구현 (implements
~Repository
) - Mybatis Repository extends
~Repository
)
- 공통 상속 클래스
- RepositoryConfig +
@Primary
어노테이션 + yml 설정을 통한 Mybatis/JPA 설정 - Service 레이어 수정 (Repository 의존성을
~Repoisitory
로 주입) - 테스트 코드 수정 및 검증
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 변환 과정은 다음과 같습니다.
- Entity 클래스 생성
- JPA Repository 생성
- JPA, Mybatis Repoisotry 호환 작업
- 공통 상속 클래스
~Repository
생성 - Mybatis ,JPA Adapter 클래스 구현 (implements
~Repository
) - Mybatis Repository extends
~Repository
)
- 공통 상속 클래스
- Adapter 클래스의 Profiles 설정, yml 설정을 통한 Mybatis/JPA 설정
@Profile("mybatis")
,@Profile("jpa")
- Service 레이어 수정 (Repository 의존성을
~Repoisitory
로 주입) - 테스트 코드 수정 및 검증
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...