Skip to content
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
c677ea9
refactor : 패키지 구조 변경
tmxhsk99 Jul 31, 2023
a2ee8df
refactor : Advice 통합을 위해 삭제
tmxhsk99 Jul 31, 2023
e254615
refactor : Advice 통합을 위해 새로 Advice 생성
tmxhsk99 Jul 31, 2023
6cf8d05
test : userCreator 테스트 작성
tmxhsk99 Jul 31, 2023
cbedd61
test : test Depth 중복으로 작성되어 수정
tmxhsk99 Jul 31, 2023
64ab92a
feat : 회원 저장기능 작성
tmxhsk99 Jul 31, 2023
c82f079
test : assertJ사용 및 fixture 구조 수정
tmxhsk99 Jul 31, 2023
1cee88f
test : 회원 업데이트 테스트 작성
tmxhsk99 Jul 31, 2023
9e7a588
feat : 회원 업데이트 기능 작성
tmxhsk99 Jul 31, 2023
1c2aa84
test : 중복되는 어노테이션 삭제
tmxhsk99 Aug 1, 2023
aa522ce
test : UserReader 테스트 작성
tmxhsk99 Aug 1, 2023
eb487d4
test : 누락된 @Test 추가
tmxhsk99 Aug 1, 2023
85623bd
test : 단일 회원 읽기 기능 추가
tmxhsk99 Aug 1, 2023
be2cac9
refactor : 회원 반환시 리탄 구조 변경
tmxhsk99 Aug 2, 2023
1c6feef
chore : 가독성을 위한 띄어쓰기 추가
tmxhsk99 Aug 2, 2023
2ab0ce1
refactor : UserReader 사용으로 변경
tmxhsk99 Aug 2, 2023
e8efe64
refactor : return 형태 변경
tmxhsk99 Aug 2, 2023
fef6b4f
refactor : 테스트 필요한 준비 위치 변경
tmxhsk99 Aug 2, 2023
447bd82
test : 회원 삭제 테스트 작성
tmxhsk99 Aug 2, 2023
837db42
feat : 회원 삭제 기능 작성
tmxhsk99 Aug 2, 2023
5315ce9
refactor : 기존 상품 서비스 분리
tmxhsk99 Aug 2, 2023
9f86d7c
test : ProductCreator 테스트 작성
tmxhsk99 Aug 2, 2023
ba5eb76
test : ProductReader 테스트 작성
tmxhsk99 Aug 2, 2023
1877491
refactor : 변수명 수정
tmxhsk99 Aug 3, 2023
9912fd4
test : 제품 삭제 테스트 작성
tmxhsk99 Aug 3, 2023
3d5c073
test : 제품 수정 테스트 작성
tmxhsk99 Aug 3, 2023
0052a8d
refactor : 유저 요청 객체 변수명 수정
tmxhsk99 Aug 3, 2023
e7b6602
refactor : 컨트롤러 의존성 변경 및 테스트 변경
tmxhsk99 Aug 3, 2023
c2d1915
chore : 오타 수정
tmxhsk99 Aug 3, 2023
a19d7c0
chore : 불필요한 의존성 및 패키지 경로 수정에 따른수정
tmxhsk99 Aug 3, 2023
526053c
chore : 불필요한 의존성 및 패키지 경로 수정에 따른수정
tmxhsk99 Aug 3, 2023
673231e
feat : validation 메시지 추가
tmxhsk99 Aug 3, 2023
0ade4a5
feat : 상품 검증 에러 관련 로직및 테스트 수정
tmxhsk99 Aug 3, 2023
d64f8bc
refactor : 중복되거나 너무 자세한 변수명,메서드명 수정
tmxhsk99 Aug 4, 2023
0b03c55
chore : 패키지 이동
tmxhsk99 Aug 4, 2023
d3c52c4
test : UserController 유저 생성 테스트 작성
tmxhsk99 Aug 4, 2023
4a38d3b
test : UserController 유저 생성 기능 작성
tmxhsk99 Aug 5, 2023
1d999b9
test : UserController 유저 수정 기능 작성
tmxhsk99 Aug 5, 2023
6484f61
chore : 오타 수정
tmxhsk99 Aug 5, 2023
6a7729a
feat : UserController 유저 수정기능 작성 및 테스트 수정
tmxhsk99 Aug 5, 2023
bd6881b
test : UserController 유저 삭제 테스트 작성
tmxhsk99 Aug 5, 2023
8bd4a18
refactor : 메서드 명 수정
tmxhsk99 Aug 5, 2023
49fe211
feat : UserController 유저 삭제 기능 추가
tmxhsk99 Aug 5, 2023
bcae44a
test : 유저 예외 테스트 추가
tmxhsk99 Aug 5, 2023
5ea2b96
feat : 유저 검증 기능 추가
tmxhsk99 Aug 5, 2023
e9aaef7
test : 유저 요청 검증 추가
tmxhsk99 Aug 5, 2023
e5e4d16
refactor : 유저 컨트롤러 분리
tmxhsk99 Aug 5, 2023
7952552
refactor : 프로덕트컨트롤러 분리
tmxhsk99 Aug 5, 2023
9cb7e38
test : ParameterizedTest 활용 예외 테스트 추가
tmxhsk99 Aug 7, 2023
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
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.codesoom.assignment.application;
package com.codesoom.assignment.application.product;

import com.codesoom.assignment.ProductNotFoundException;
import com.codesoom.assignment.domain.Product;
import com.codesoom.assignment.domain.ProductRepository;
import com.codesoom.assignment.dto.ProductData;
import com.codesoom.assignment.domain.product.Product;
import com.codesoom.assignment.domain.product.ProductRepository;
import com.codesoom.assignment.dto.product.ProductData;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.codesoom.assignment.application.user;

import com.codesoom.assignment.domain.user.User;
import com.codesoom.assignment.domain.user.UserRepository;
import com.codesoom.assignment.dto.user.UserRequest;
import org.springframework.stereotype.Service;

@Service
public class UserCreator {
private final UserRepository userRepository;
public UserCreator(UserRepository userRepository) {
Copy link
Contributor

Choose a reason for hiding this comment

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

위에 빈 줄 하나를 추가해서 생성자와 속성을 분리하면 좋을 것 같아요

this.userRepository = userRepository;
}

public User createUser(UserRequest userRequest) {
return userRepository.save(userRequest.toUser());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

package com.codesoom.assignment.application.user;

import com.codesoom.assignment.domain.user.User;
import com.codesoom.assignment.domain.user.UserRepository;
import org.springframework.stereotype.Service;

@Service
public class UserReader {
private final UserRepository userRepository;

public UserReader(UserRepository userRepository) {
this.userRepository = userRepository;
}

public User getUser(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("해당하는 유저가 없습니다."));
return user;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.codesoom.assignment.application.user;

import com.codesoom.assignment.domain.user.User;
import com.codesoom.assignment.domain.user.UserRepository;
import com.codesoom.assignment.dto.user.UserRequest;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@Service
public class UserUpdater {
private UserRepository userRepository;

public UserUpdater(UserRepository userRepository) {
this.userRepository = userRepository;
}

@Transactional
public User updateUser(Long id, UserRequest userRequest) {
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("해당하는 유저가 없습니다."));
Copy link
Contributor

Choose a reason for hiding this comment

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

위에서 만든 userReader의 getUser()를 사용해도 좋을 것 같아요

user.change(userRequest.getName(), userRequest.getEmail(), userRequest.getPassword());

User updatedUser = userRepository.save(user);
return updatedUser;
Copy link
Contributor

Choose a reason for hiding this comment

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

우변이 이미 충분히 설명해주고 있는 것 같아서, 변수 선언 없이 바로 반환해줘도 좋을 것 같아요

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class NotFoundErrorAdvice {
public class ExceptionAdvice {
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ProductNotFoundException.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.codesoom.assignment.controllers;
package com.codesoom.assignment.controllers.product;

import com.codesoom.assignment.application.ProductService;
import com.codesoom.assignment.domain.Product;
import com.codesoom.assignment.dto.ProductData;
import com.codesoom.assignment.application.product.ProductService;
import com.codesoom.assignment.domain.product.Product;
import com.codesoom.assignment.dto.product.ProductData;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.codesoom.assignment.domain;
package com.codesoom.assignment.domain.product;

import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.codesoom.assignment.domain;
package com.codesoom.assignment.domain.product;

import java.util.List;
import java.util.Optional;
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/java/com/codesoom/assignment/domain/user/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.codesoom.assignment.domain.user;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@GeneratedValue
private Long id;

private String name;

private String email;

private String password;

public void change(String name, String email, String password) {
this.name = name;
this.email = email;
this.password = password;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.codesoom.assignment.domain.user;

import com.codesoom.assignment.domain.product.Product;

import java.util.Optional;

public interface UserRepository {
User save(User user);

Optional<User> findById(Long id);

void delete(User user);

void deleteAll();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.codesoom.assignment.dto;
package com.codesoom.assignment.dto.product;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.codesoom.assignment.dto.user;

import com.codesoom.assignment.domain.user.User;
import lombok.*;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserRequest {
private String name;
private String email;
private String password;

public User toUser() {
return User.builder()
.name(name)
.email(email)
.password(password)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.codesoom.assignment.infra;
package com.codesoom.assignment.infra.product;

import com.codesoom.assignment.domain.Product;
import com.codesoom.assignment.domain.ProductRepository;
import com.codesoom.assignment.domain.product.Product;
import com.codesoom.assignment.domain.product.ProductRepository;
import org.springframework.context.annotation.Primary;
import org.springframework.data.repository.CrudRepository;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.codesoom.assignment.infra.user;

import com.codesoom.assignment.domain.user.User;
import com.codesoom.assignment.domain.user.UserRepository;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;

@Primary
Copy link
Contributor

Choose a reason for hiding this comment

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

@Primary를 사용하셨군요.

이번 기회에 https://tech.kakaopay.com/post/martin-dev-honey-tip-2/ 이 글을 한 번 읽어봅시다

public interface JpaUserRepository extends
UserRepository, CrudRepository<User, Long> {
}
15 changes: 15 additions & 0 deletions app/src/test/java/com/codesoom/assignment/application/JpaTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.codesoom.assignment.application;

import com.codesoom.assignment.domain.user.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

@DataJpaTest
Copy link
Contributor

Choose a reason for hiding this comment

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

@DataJpaTest를 쓰면 테스트를 위한 in memory로 동작할거에요. 이렇게 해도 대부분 처리되지만 실제 DB랑은 차이가 있을 수 있어요. 그래서 정말 제대로 테스트하려면 실제 DB랑 테스트하도록 하는 것이 좋을 것 같아요.

public class JpaTest {
@Autowired
public UserRepository userRepository;

public UserRepository getUserRepository() {
return userRepository;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.codesoom.assignment.application;

import com.codesoom.assignment.ProductNotFoundException;
import com.codesoom.assignment.domain.Product;
import com.codesoom.assignment.domain.ProductRepository;
import com.codesoom.assignment.dto.ProductData;
import com.codesoom.assignment.application.product.ProductService;
import com.codesoom.assignment.domain.product.Product;
import com.codesoom.assignment.domain.product.ProductRepository;
import com.codesoom.assignment.dto.product.ProductData;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.codesoom.assignment.application.user;

import com.codesoom.assignment.application.JpaTest;
import com.codesoom.assignment.domain.user.User;
import com.codesoom.assignment.dto.user.UserRequest;
import org.junit.jupiter.api.*;

import org.assertj.core.api.Assertions;

@SuppressWarnings({"InnerClassMayBeStatic", "NonAsciiCharacters"})
@DisplayName("UserCreator 클래스")
class UserCreatorTest extends JpaTest {
private final String TEST_NAME = "testName";
private final String TEST_EMAIL = "test@Email.com";
private final String TEST_PASSWORD = "testPassword";

private UserRequest createUserRequest() {
return new UserRequest(
TEST_NAME,
TEST_EMAIL,
TEST_PASSWORD
);
}

@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class createUser_메서드는 {
@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class 유저_정보가_주어지면 {
private UserRequest USER_REQUEST;
private UserCreator userCreator;
Copy link
Contributor

Choose a reason for hiding this comment

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

Describe - Context - It에서 Context는 주어진 상황이 달라지는 경우를 명시합니다. 테스트에 필요한 준비는 여기가 아니라 Describe 밑에 혹은 바깥에 있는게 좋을 것 같아요. 오히려 여기에 이런 것들이 있으면 테스트 case마다 달라지나? 생각이 들 것 같아요

@BeforeEach
void setUp() {
USER_REQUEST = createUserRequest();
userCreator = new UserCreator(getUserRepository());
}

@Test
@DisplayName("해당_유저정보를_저장_후_저장한_유저정보를_리턴한다")
void it_saves_and_returns_user() {
User user = userCreator.createUser(USER_REQUEST);

Assertions.assertThat(user.getName()).isEqualTo(TEST_NAME);
Assertions.assertThat(user.getEmail()).isEqualTo(TEST_EMAIL);
Assertions.assertThat(user.getPassword()).isEqualTo(TEST_PASSWORD);
}

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.codesoom.assignment.application.user;

import com.codesoom.assignment.application.JpaTest;
import com.codesoom.assignment.dto.user.UserRequest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.*;


@SuppressWarnings({"InnerClassMayBeStatic", "NonAsciiCharacters"})
@DisplayName("UserReader 클래스")
class UserReaderTest extends JpaTest {
private final String TEST_NAME = "testName";
private final String TEST_EMAIL = "test@Email.com";
private final String TEST_PASSWORD = "testPassword";

private UserRequest createUserRequest() {
return new UserRequest(
TEST_NAME,
TEST_EMAIL,
TEST_PASSWORD
);
}

@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class getUser_메서드는 {
@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class 유저_아이디가_주어지면 {
private UserRequest USER_REQUEST;
private Long savedUserId;
private UserReader userReader;

@BeforeEach
void setUp() {
USER_REQUEST = createUserRequest();
savedUserId = getUserRepository().save(USER_REQUEST.toUser()).getId();
userReader = new UserReader(getUserRepository());
}

@DisplayName("해당_유저정보를_리턴한다")
@Test
void it_returns_user() {
Assertions.assertThat(userReader.getUser(savedUserId).getName()).isEqualTo(TEST_NAME);
Assertions.assertThat(userReader.getUser(savedUserId).getEmail()).isEqualTo(TEST_EMAIL);
Assertions.assertThat(userReader.getUser(savedUserId).getPassword()).isEqualTo(TEST_PASSWORD);
}
}
}

}
Loading