Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

전남대 BE_안원모_3주차 과제(3단계) #447

Merged
merged 49 commits into from
Jul 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
8753eee
STEP0를 위한 기존 코드 가져오기
Wonmoan Jul 11, 2024
0eb427a
Refactor : MebemerController의 else 로직 리펙토링
Wonmoan Jul 11, 2024
5f26e8f
Refactor : RuntimeException 응답방식 수정
Wonmoan Jul 11, 2024
1b6f069
Refactor : JwtService 키 생성방식 최신화
Wonmoan Jul 11, 2024
eb87ec1
Refactor : 사용 하지 않는 주석 제거
Wonmoan Jul 11, 2024
16400e6
Refactor : 응답 반환 형식 통일
Wonmoan Jul 11, 2024
e4514c0
Refactor : WishController 오류 처리 GlobalExceptionHandler에서 수행하도록 변경
Wonmoan Jul 11, 2024
e620367
Refactor : layerd architecture 따른 패키지 구조 조정
Wonmoan Jul 11, 2024
625a5c4
Refactor : JPA 리팩토링에 따른 변경사항 추가
Wonmoan Jul 11, 2024
b8a2981
Refactor : wish 테이블 포함한 schema로 수정
Wonmoan Jul 11, 2024
39c50eb
Refactor : Product 도메인 JPA로 리펙토링 엔티티 클래스로 변경
Wonmoan Jul 11, 2024
2b7e729
Refactor : Member 도메인 JPA로 리펙토링 엔티티 클래스로 변경
Wonmoan Jul 11, 2024
f991f62
Refactor : 패키지 경로 수정
Wonmoan Jul 11, 2024
f7aec38
Refactor : JPA 저장소로 리팩토링
Wonmoan Jul 11, 2024
6cd3537
Feat : @DataJpaTest 활용 회원저장소 테스트 코드 구현
Wonmoan Jul 11, 2024
4389367
Feat : @DataJpaTest 활용 회원저장소 테스트 코드 구현
Wonmoan Jul 11, 2024
b1c90bb
Feat : @DataJpaTest 활용 상품저장소 테스트 코드 구현
Wonmoan Jul 11, 2024
0831c87
Feat : @DataJpaTest 활용 위리리스트 테스트 코드 구현
Wonmoan Jul 11, 2024
d9ce007
Reafactor : JPA형식에 따른 update 메서드 수정
Wonmoan Jul 11, 2024
448076c
Refactor : JWT 서명 키 수정
Wonmoan Jul 11, 2024
f576700
Refactor : 코드 컨벤션에 맞게 수정
Wonmoan Jul 11, 2024
008ad15
Docs : README.md 작성
Wonmoan Jul 11, 2024
75edcc2
Refactor : Member,Product,Wish 도메인 객체 참조 & 외래 키 매핑
Wonmoan Jul 12, 2024
56ba257
Docs : README.md작성
Wonmoan Jul 12, 2024
923e2e3
Refactor : DB 초기데이터 동적 생성,삽입
Wonmoan Jul 12, 2024
b5fd6ef
Refactor : 불필요한 어노테이션 삭제
Wonmoan Jul 13, 2024
ab9dc63
Refactor : getValidMember 메서드 예외 처리방식 변경
Wonmoan Jul 13, 2024
e897194
Refactor : DataLoader 사용 하지 않는 throw 제거
Wonmoan Jul 13, 2024
2282ccc
Refactor : 로깅 포매팅 방식으로 변경
Wonmoan Jul 13, 2024
cacfaae
Refactor : 불필요한 어노테이션 삭제
Wonmoan Jul 13, 2024
2e67bfd
Refacotr : 불필요한 throws Exception 제거
Wonmoan Jul 13, 2024
6d0f590
Refactor : id 값 중복으로 받지 않도록 수정
Wonmoan Jul 13, 2024
ad48400
Refactor : 기존 controller 에서 예외 처리 방식 resolver로 예외처리 방식으로 변경
Wonmoan Jul 13, 2024
98c2893
Refactor : JwtService 사용하지 않는 메서드 삭제
Wonmoan Jul 13, 2024
c5d7da7
Refactor : 코드 가독성 수정
Wonmoan Jul 13, 2024
b1184c2
Refactor : Member 도메인 기능 분리, MemberDTO생성
Wonmoan Jul 13, 2024
d7982bd
Refactor : Product 도메인 기능 분리 , ProductDTO 생성
Wonmoan Jul 13, 2024
e3cdc64
Refactor : 컨트롤러 DTO 받도록 수정
Wonmoan Jul 13, 2024
0b5f982
Refacotr : 불필요한 어노테이션 삭제
Wonmoan Jul 13, 2024
6608fcf
Refactor : JSON 직렬화 수정
Wonmoan Jul 13, 2024
4a1ea83
Refactor : 디버깅 목적 로깅 삭제
Wonmoan Jul 13, 2024
360ab5b
Refactor : 회원 등록시 예외 처리 방식 변경
Wonmoan Jul 15, 2024
54da214
Refactor : wish 도메인 로드 방식 변경
Wonmoan Jul 15, 2024
ed9b362
Feat : Product 페이지네이션 구현
Wonmoan Jul 15, 2024
f7662bd
Feat : Wish 페이지네이션 구현
Wonmoan Jul 15, 2024
16a7b90
Refactor : DB 초기데이터 동적 생성 초기값 변경
Wonmoan Jul 15, 2024
9523e28
Feat : 숫자 포함된 문자열 정렬 로직 추가
Wonmoan Jul 15, 2024
b5778c7
Docs : README.md 작성
Wonmoan Jul 15, 2024
b89305d
Merge branch 'wonmoan' into step3
Wonmoan Jul 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,8 @@
## step2
- 객체의 참조와 테이블의 외래 키를 매핑해서 객체에서는 참조를 사용
- 테이블에서는 외래 키를 사용

## step3
- 상품과 위시 리스트 보기에 페이지네이션을 구현한다.
- 정렬 방법을 설정하여 보고 싶은 정보의 우선 순위를 정할 수 있다

2 changes: 1 addition & 1 deletion src/main/java/gift/config/DataLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public DataLoader(ProductRepository productRepository) {

@Override
public void run(String... args) {
for (int i = 3; i <= 10; i++) {
for (int i = 3; i <= 15; i++) {
Product product = new Product.ProductBuilder()
.name("Product" + i)
.price(BigDecimal.valueOf(10.00 * i))
Expand Down
14 changes: 5 additions & 9 deletions src/main/java/gift/controller/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,11 @@ public MemberController(MemberService memberService, JwtService jwtService) {

@PostMapping("/register")
public ResponseEntity<Map<String, String>> register(@Valid @RequestBody MemberDTO memberDTO) {
try {
Member member = memberDTO.toEntity();
Member savedMember = memberService.createMember(member);
Map<String, String> response = new HashMap<>();
response.put("token", jwtService.generateToken(savedMember));
return ResponseEntity.ok(response);
} catch (Exception e) {
throw new RuntimeException("Error during registration: " + e.getMessage(), e);
}
Member member = memberDTO.toEntity();
Member savedMember = memberService.createMember(member);
Map<String, String> response = new HashMap<>();
response.put("token", jwtService.generateToken(savedMember));
return ResponseEntity.ok(response);
}

@PostMapping("/login")
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/gift/controller/ProductController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import gift.service.ProductService;
import jakarta.validation.Valid;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand All @@ -28,6 +30,11 @@ public List<Product> getProducts() {
return productService.findAllProducts();
}

@GetMapping("/paged")
public Page<Product> getProducts(Pageable pageable) {
return productService.findAllProducts(pageable);
}

@PostMapping
public Product postProduct(@Valid @RequestBody ProductDTO productDTO) {
Product product = productDTO.toEntity();
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/gift/controller/WishController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import gift.util.LoginMember;
import jakarta.validation.Valid;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -34,6 +36,12 @@ public ResponseEntity<List<Wish>> getWishes(@LoginMember Member member) {
return ResponseEntity.ok(wishes);
}

@GetMapping("/paged")
public ResponseEntity<Page<Wish>> getPagedWishes(@LoginMember Member member, Pageable pageable) {
Page<Wish> wishes = wishService.getWishesByMemberId(member.getId(), pageable);
return ResponseEntity.ok(wishes);
}

@PostMapping
public ResponseEntity<String> addWish(@RequestBody @Valid WishDTO wishDTO, @LoginMember Member member) {
Product product = productService.getProductById(wishDTO.getProductId());
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/gift/domain/Wish.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ public class Wish {

@NotNull
@JsonManagedReference
@ManyToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "member_id", nullable = false)
private Member member;

@NotNull
@JsonManagedReference
@ManyToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "product_id", nullable = false)
private Product product;

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/gift/repository/ProductRepository.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package gift.repository;
import gift.domain.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findAll(Pageable pageable);
}
4 changes: 3 additions & 1 deletion src/main/java/gift/repository/WishRepository.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package gift.repository;
import gift.domain.Wish;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface WishRepository extends JpaRepository<Wish, Long> {
List<Wish> findAllByMemberId(Long memberId);
void deleteByMemberIdAndProductId(Long memberId, Long productId);
Page<Wish> findAllByMemberId(Long memberId, Pageable pageable);
}
37 changes: 37 additions & 0 deletions src/main/java/gift/service/ProductService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

import gift.domain.Product;
import gift.repository.ProductRepository;
import gift.util.AlphanumericComparator;
import java.util.Collections;
import java.util.Comparator;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.List;

Expand All @@ -18,6 +24,37 @@ public List<Product> findAllProducts() {
return productRepository.findAll();
}

public Page<Product> findAllProducts(Pageable pageable) {
List<Product> products = getSortedProducts();

return paginate(products, pageable);
}

private List<Product> getSortedProducts() {
List<Product> products = productRepository.findAll();
products.sort(Comparator.comparing(Product::getName, new AlphanumericComparator()));
return products;
}

private Page<Product> paginate(List<Product> products, Pageable pageable) {
int pageSize = pageable.getPageSize();
int currentPage = pageable.getPageNumber();
int startItem = currentPage * pageSize;

List<Product> paginatedList = getPaginatedList(products, startItem, pageSize);

return new PageImpl<>(paginatedList, pageable, products.size());
}

private List<Product> getPaginatedList(List<Product> products, int startItem, int pageSize) {
if (products.size() <= startItem) {
return Collections.emptyList();
}

int toIndex = Math.min(startItem + pageSize, products.size());
return products.subList(startItem, toIndex);
}

public Product createProduct(Product product) {
return productRepository.save(product);
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/gift/service/WishService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import gift.domain.Wish;
import gift.repository.WishRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import org.springframework.stereotype.Service;
Expand All @@ -19,6 +21,11 @@ public List<Wish> getWishesByMemberId(Long memberId) {
return wishRepository.findAllByMemberId(memberId);
}

@Transactional(readOnly = true)
public Page<Wish> getWishesByMemberId(Long memberId, Pageable pageable) {
return wishRepository.findAllByMemberId(memberId, pageable);
}

@Transactional
public void addWish(Wish wish) {
wishRepository.save(wish);
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/gift/util/AlphanumericComparator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package gift.util;

import java.util.Comparator;

public class AlphanumericComparator implements Comparator<String> {

@Override
public int compare(String o1, String o2) {
if (o1 == null || o2 == null) {
return o1 == null ? -1 : 1;
}

int i = 0, j = 0;
while (i < o1.length() && j < o2.length()) {
char c1 = o1.charAt(i);
char c2 = o2.charAt(j);

if (Character.isDigit(c1) && Character.isDigit(c2)) {
int num1 = 0, num2 = 0;
while (i < o1.length() && Character.isDigit(o1.charAt(i))) {
num1 = num1 * 10 + (o1.charAt(i) - '0');
i++;
}
while (j < o2.length() && Character.isDigit(o2.charAt(j))) {
num2 = num2 * 10 + (o2.charAt(j) - '0');
j++;
}
if (num1 != num2) {
return Integer.compare(num1, num2);
}
} else {
if (c1 != c2) {
return Character.compare(c1, c2);
}
i++;
j++;
}
}

Comment on lines +7 to +39

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

알고리즘 코드 보고 가져온 것 같은 느낌이 강한데,
이왕이면 이 코드도 변수명, 메서드 분리 등
컨벤션을 신경써서 작성해보면 좋을 것 같아요.

return Integer.compare(o1.length(), o2.length());
}
}