diff --git "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongApplication.java" "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongApplication.java" index b5ea21e..2f7072d 100644 --- "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongApplication.java" +++ "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongApplication.java" @@ -4,6 +4,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +// 님이 있는 패키지 기준으로 컴포넌트 스캔을 시작합니다.. @SpringBootApplication public class KongApplication { diff --git "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongController.java" "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongController.java" index 78474c7..16d275b 100644 --- "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongController.java" +++ "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongController.java" @@ -1,12 +1,17 @@ package com.example.kong; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; /* Spring Boot에서 컨트롤러는 어떻게 인식할까요? */ +@RestController //@Controller(이쪽으로 가면 View에염) + @ResponseBody(메서드 어노테이션) -> Http Response에 박아버려 View 찾지 마셈 +@RequiredArgsConstructor public class KongController { - private KongService kongService; + private final KongService kongService; + // 내장된 톰캣(Tomcat) 서버나 다른 서블릿 컨테이너 위에서 애플리케이션 실행 시 요청을 컨트롤러로 라우팅. @GetMapping("/reaction") public String reaction() { return kongService.reactToDrink(); diff --git "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongService.java" "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongService.java" index 27bd1ac..9231c88 100644 --- "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongService.java" +++ "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/KongService.java" @@ -3,12 +3,29 @@ import com.example.kong.util.DrinkPrinter; import com.example.kong.util.DrinkProperties; import com.example.kong.util.Space; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /* Spring Boot에서 서비스는 어떻게 인식할까요? */ +@Service // 동일하게 컴포넌트 스캔 Component 파생 어노테이션 +@RequiredArgsConstructor public class KongService { /* 어떻게 주입받아야 할까요? */ - private DrinkProperties drinkProperties; + /* + * @RequiredArgsConstructor + * final / @NonNull 필드들에 대해 생성자 자동 생성 + * DI를 위해 사용, final 키워드가 붙은 모든 필드를 인자로 받아 의존성 주입 + * 아래의 긴 코드들을 Lombok이 깨깟하게 정리 + * + * @Autowired + * public KongService(DrinkProperties drinkProperties) { + * this.drinkProperties = drinkProperties; + * } + * */ + private final DrinkProperties drinkProperties; + // 냄새가 나는 코드지만 예제를 위한 부분이니 신경쓰지 말아주세요.. public String reactToDrink() { diff --git "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/util/DrinkProperties.java" "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/util/DrinkProperties.java" index 82e67f8..e7ecea8 100644 --- "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/util/DrinkProperties.java" +++ "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/java/com/example/kong/util/DrinkProperties.java" @@ -4,10 +4,28 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +/* +* 1. 클래스가 Spring Container에 의해 인스턴스화 +* 2. Spring Bean으로 관리되어야한다 명시화 +* +* -> 컴포넌트 스캔, Spring Context에 bean으로 등록 및 생명주기 관리 +* @Autowired 같은 어노테이션을 통해 의존성 주입 가능 +* */ @Component // 가 뭘까요? -@Getter +@Getter // Lombok -> Getter 선언. 외부에서도 값을 읽을 수 있다 public class DrinkProperties { + /* + * 프로퍼티 파일, 환경 변수, 커맨드 라인 인자 등에서 값을 주입 + * application.properties 또는 application.yml 파일에 정의된 프로퍼티 값을 클래스의 필드에 바인딩 + * + * Spring이 관리하는 빈의 초기화 시점에서 applicaiont~ 에서 해당 값을 서치, 계층별로 나타내고 있다. + * -> 클래스 내부 필드에 바인딩(drink에 주입) + * + * BeanCreationException(생성할랬더니 그런거 없는디요?에러)를 방지하기 위해 + * @Value("${spring.kong.what-kind-of-drink:coke}") + * 이런 식으로 default 값을 정해줄 수도 있다네용 + * */ @Value("${spring.kong.what-kind-of-drink}") // 는 어떻게 값을 가져오는 걸까요? private String drink; } diff --git "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/resources/application.yml" "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/resources/application.yml" index d1b299e..70f224e 100644 --- "a/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/resources/application.yml" +++ "b/v1/backend/SPRING_LV_1_\354\275\251_\354\213\254\354\235\200_\353\215\260_\354\275\251_\353\202\234\353\213\244/src/main/resources/application.yml" @@ -1,3 +1,3 @@ spring: kong: - what-kind-of-drink: 'coffee' \ No newline at end of file + what-kind-of-drink: 'coke' \ No newline at end of file diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" deleted file mode 100644 index be46233..0000000 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.lent; - -import com.example.lent.dto.LentRequest; -import com.example.lent.dto.LentResponse; - -/*컨트롤러는 뭘까요?*/ -/*컨트롤러는 왜 인터페이스가 없어도 될까요?*/ -public class LentController { - private LentService lentService; - - public LentResponse lent(LentRequest request) { - return null; - } -} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" deleted file mode 100644 index 534a121..0000000 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.lent; - -import com.example.lent.domain.LentHistory; - -import java.util.List; - -public interface LentHistoryRepository { - LentHistory save(LentHistory lentHistory); - - List findAll(); -} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" deleted file mode 100644 index 96cff00..0000000 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.lent; - -import com.example.lent.domain.LentHistory; - -import java.util.ArrayList; -import java.util.List; - -/*리포지토리는 뭘까요?*/ -public class LentHistoryRepositoryImpl implements LentHistoryRepository { - private static Long ID_SEQUENCE = 1L; - /*실제 DB를 사용하지 않으므로 내부 Collection으로 대체합니다. - Collection이 뭘까요?*/ - private static final List TABLE = new ArrayList<>(); - - @Override - public LentHistory save(LentHistory lentHistory) { - return null; - } - - @Override - public List findAll() { - return null; - } -} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" deleted file mode 100644 index 4ecff32..0000000 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.lent; - -import com.example.lent.dto.LentRequest; -import com.example.lent.dto.LentResponse; - -/*서비스는 뭘까요?*/ -public class LentServiceImpl implements LentService { - @Override - public LentResponse lent(LentRequest request) { - return null; - } -} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" new file mode 100644 index 0000000..a9965ea --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" @@ -0,0 +1,19 @@ +package com.example.lent.controller; + +import com.example.lent.dto.LentRequest; +import com.example.lent.dto.LentResponse; +import com.example.lent.service.LentService; + +/*컨트롤러는 뭘까요?*/ +/*컨트롤러는 왜 인터페이스가 없어도 될까요?*/ +public class LentController { + private final LentService lentService; + + public LentController(LentService lentService) { + this.lentService = lentService; + } + + public LentResponse lent(LentRequest request) { + return lentService.lent(request); + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" index d86aa42..9dc3396 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" @@ -1,21 +1,23 @@ package com.example.lent.domain; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; /*Entity가 뭘까요?*/ @Getter public class Cabinet { - private Long cabinetId; - private CabinetStatus cabinetStatus; + private Long cabinetId; + private CabinetStatus cabinetStatus; - public Cabinet(CabinetStatus status) { - this.cabinetId = null; - this.cabinetStatus = status; - } + public Cabinet(CabinetStatus status) { + this.cabinetId = null; + this.cabinetStatus = status; + } - public void id(Long id) { - this.cabinetId = id; - } + public void id(Long id) { + this.cabinetId = id; + } + + public void setStatus(CabinetStatus cabinetStatus) { + this.cabinetStatus = cabinetStatus; + } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" index d7f3169..d4fb3b1 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" @@ -1,26 +1,29 @@ package com.example.lent.domain; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - import java.time.LocalDateTime; +import lombok.Getter; /*Entity가 뭘까요?*/ @Getter public class LentHistory { - private Long lentHistoryId; - private Long userId; - private Long cabinetId; - private String lentUserName; - private LocalDateTime createdAt; - private LocalDateTime expiredAt; + private Long lentHistoryId; + private Long userId; + private Long cabinetId; + private String lentUserName; + private LocalDateTime createdAt; + private LocalDateTime expiredAt; + + public LentHistory(Long cabinetId, Long userId, String lentUserName, LocalDateTime createdAt, + LocalDateTime expiredAt) { + this.cabinetId = cabinetId; + this.userId = userId; + this.lentUserName = lentUserName; + this.createdAt = createdAt; + this.expiredAt = expiredAt; + } + + public void id(Long id) { + this.lentHistoryId = id; + } - public LentHistory(Long cabinetId, Long userId, String lentUserName, LocalDateTime createdAt, LocalDateTime expiredAt) { - this.cabinetId = cabinetId; - this.userId = userId; - this.lentUserName = lentUserName; - this.createdAt = createdAt; - this.expiredAt = expiredAt; - } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/dto/LentResponse.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/dto/LentResponse.java" index dfc04a7..5b0639b 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/dto/LentResponse.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/dto/LentResponse.java" @@ -1,18 +1,16 @@ package com.example.lent.dto; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.time.LocalDateTime; /*DTO가 뭘까요?*/ @AllArgsConstructor @Getter public class LentResponse { - private Long lentHistoryId; - private Long cabinetId; - private String userName; - private LocalDateTime lentAt; - private LocalDateTime expiredAt; + private Long lentHistoryId; + private Long cabinetId; + private String userName; + private LocalDateTime lentAt; + private LocalDateTime expiredAt; } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" new file mode 100644 index 0000000..dcbd781 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" @@ -0,0 +1,10 @@ +package com.example.lent.repository; + +import com.example.lent.domain.LentHistory; +import java.util.List; + +public interface LentHistoryRepository { + LentHistory save(LentHistory lentHistory); + + List findAll(); +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" new file mode 100644 index 0000000..53e319d --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" @@ -0,0 +1,53 @@ +package com.example.lent.repository; + +import com.example.lent.domain.LentHistory; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/*리포지토리는 뭘까요?*/ +public class LentHistoryRepositoryImpl implements LentHistoryRepository { + private static Long ID_SEQUENCE = 1L; + /*실제 DB를 사용하지 않으므로 내부 Collection으로 대체합니다. - Collection이 뭘까요?*/ + private static final List TABLE = new ArrayList<>(); + + /** + * @param lentHistory cabinetId, userId, lentUserName, createAt, expiredAt + * @return + */ + @Override + public LentHistory save(LentHistory lentHistory) { + // update + if (lentHistory.getLentHistoryId() != null) { + TABLE.removeIf(history -> history.getLentHistoryId().equals(lentHistory.getLentHistoryId())); + TABLE.add(lentHistory); + return lentHistory; + } + // new + lentHistory.id(ID_SEQUENCE++); + TABLE.add(lentHistory); + return lentHistory; + } + + @Override + public List findAll() { + /* + * unmodifiable vs copyOf vs new ArrayList<>(TABLE) + * + * unmodifiable~ + * 복사본의 추가, 삭제, 갱신 등의 변경 작업은 불가. + * 사본 리스트를 변경하려고 하면 UnsupportedOperationException이 발생 + * 원본 변경 시 복사본도 변경 + * + * copyOf~ + * 복사본의 추가, 삭제, 갱신 등의 변경 작업은 불가. + * 사본 리스트를 변경하려고 하면 UnsupportedOperationException이 발생 + * 원본 변경해도 복사본은 독립적 + * + * new Array~ + * 변경 가능, 복사본은 독립적 + * */ + return Collections.unmodifiableList(TABLE); + } + +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" similarity index 60% rename from "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" rename to "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" index 1892b70..0c07095 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" @@ -1,8 +1,8 @@ -package com.example.lent; +package com.example.lent.service; import com.example.lent.dto.LentRequest; import com.example.lent.dto.LentResponse; public interface LentService { - LentResponse lent(LentRequest request); + LentResponse lent(LentRequest request); } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" new file mode 100644 index 0000000..e9c7724 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" @@ -0,0 +1,78 @@ +package com.example.lent.service; + +import com.example.lent.domain.Cabinet; +import com.example.lent.domain.CabinetStatus; +import com.example.lent.domain.LentHistory; +import com.example.lent.domain.User; +import com.example.lent.dto.LentRequest; +import com.example.lent.dto.LentResponse; +import com.example.lent.repository.LentHistoryRepository; +import com.example.lent.testutil.CabinetRepository; +import com.example.lent.testutil.UserRepository; +import java.util.List; + +/*서비스는 뭘까요?*/ +public class LentServiceImpl implements LentService { + private static final int LENT_DAYS = 31; + private final LentHistoryRepository lentHistoryRepository; + private final CabinetRepository cabinetRepository; + private final UserRepository userRepository; + + public LentServiceImpl(LentHistoryRepository lentHistoryRepository, CabinetRepository cabinetRepository, + UserRepository userRepository) { + this.lentHistoryRepository = lentHistoryRepository; + this.cabinetRepository = cabinetRepository; + this.userRepository = userRepository; + } + + /** + * @param request -> cabinetId, userId, localDateTime + * @return LentResponse -> historyId, cabinetId, usrName, lentAt, expiredAt + */ + @Override + public LentResponse lent(LentRequest request) { + Cabinet cabinet = cabinetRepository.findById(request.getCabinetId()); + validateCabinetStatus(cabinet); + + User user = userRepository.findById(request.getUserId()); + validateUserStatus(user); + + LentHistory lentHistory = new LentHistory(cabinet.getCabinetId(), user.getUserId(), user.getName(), + request.getCreatedAt(), request.getCreatedAt().plusDays(LENT_DAYS)); + cabinet.setStatus(CabinetStatus.FULL); + cabinetRepository.save(cabinet); + + if (!isAlreadyHasLentUser(user)) { + lentHistoryRepository.save(lentHistory); + } + + return new LentResponse(lentHistory.getLentHistoryId(), lentHistory.getCabinetId(), + lentHistory.getLentUserName(), lentHistory.getCreatedAt(), lentHistory.getExpiredAt()); + } + + private boolean isAlreadyHasLentUser(User user) { + List lentHistories = lentHistoryRepository.findAll(); + boolean isAlreadyLentUser = lentHistories.stream() + .anyMatch(history -> history.getUserId().equals(user.getUserId())); + if (isAlreadyLentUser) { + throw new RuntimeException("이미 대여 중인 유저입니다."); + } + return false; + } + + /** + * 궁금한 점 -> 1. 왜 interface를 사용할까? 2.Repository 내에서 Exception을 발생시키는 이유? + */ + private void validateUserStatus(User user) { + if (user.isBanned()) { + throw new RuntimeException("사용 정지상태인 유저입니다."); + } + } + + private void validateCabinetStatus(Cabinet cabinet) { + if (cabinet.getCabinetStatus() == CabinetStatus.FULL) { + throw new RuntimeException("이미 사용 중인 사물함입니다."); + } + } + +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/testutil/CabinetRepository.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/testutil/CabinetRepository.java" index 1c98af8..e276de4 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/testutil/CabinetRepository.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/testutil/CabinetRepository.java" @@ -1,28 +1,34 @@ package com.example.lent.testutil; import com.example.lent.domain.Cabinet; - import java.util.ArrayList; import java.util.List; public class CabinetRepository { - private static Long ID_SEQUENCE = 1L; - /*실제 DB를 사용하지 않으므로 내부 Collection으로 대체합니다. - Collection이 뭘까요?*/ - private final List TABLE = new ArrayList<>(); + private static Long ID_SEQUENCE = 1L; + /*실제 DB를 사용하지 않으므로 내부 Collection으로 대체합니다. - Collection이 뭘까요?*/ + private final List TABLE = new ArrayList<>(); + + /*왜 copyOf를 사용할까요?*/ + public List findAll() { + return List.copyOf(TABLE); + } - /*왜 copyOf를 사용할까요?*/ - public List findAll() { - return List.copyOf(TABLE); - } + public Cabinet findById(Long id) { + return TABLE.stream() + .filter(c -> c.getCabinetId().equals(id)) + .findFirst() + .orElseThrow(() -> new RuntimeException("존재하지 않는 Cabinet입니다.")); + } - public Cabinet save(Cabinet cabinet) { - if (cabinet.getCabinetId() != null) { - TABLE.removeIf(c -> c.getCabinetId().equals(cabinet.getCabinetId())); - TABLE.add(cabinet); - return cabinet; - } - cabinet.id(ID_SEQUENCE++); - TABLE.add(cabinet); - return cabinet; - } + public Cabinet save(Cabinet cabinet) { + if (cabinet.getCabinetId() != null) { + TABLE.removeIf(c -> c.getCabinetId().equals(cabinet.getCabinetId())); + TABLE.add(cabinet); + return cabinet; + } + cabinet.id(ID_SEQUENCE++); + TABLE.add(cabinet); + return cabinet; + } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" index 867c614..68aafdd 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" @@ -1,117 +1,125 @@ package com.example.lent; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.example.lent.controller.LentController; import com.example.lent.domain.Cabinet; import com.example.lent.domain.CabinetStatus; import com.example.lent.domain.LentHistory; import com.example.lent.domain.User; import com.example.lent.dto.LentRequest; import com.example.lent.dto.LentResponse; +import com.example.lent.repository.LentHistoryRepository; +import com.example.lent.repository.LentHistoryRepositoryImpl; +import com.example.lent.service.LentService; +import com.example.lent.service.LentServiceImpl; import com.example.lent.testutil.CabinetRepository; import com.example.lent.testutil.UserRepository; +import java.time.LocalDateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.time.LocalDateTime; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - public class LentTest { - private LentController lentController; - private LentService lentService; - private UserRepository userRepository; - private LentHistoryRepository lentHistoryRepository; - private CabinetRepository cabinetRepository; - - // 내부 구현을 작성하신 후에, 아래의 주석을 해제해주세요. - 의존성 주입이 뭘까요? - @BeforeEach - public void setUp() { - userRepository = new UserRepository(); - cabinetRepository = new CabinetRepository(); - lentHistoryRepository = new LentHistoryRepositoryImpl(); - lentService = new LentServiceImpl(/*lentHistoryRepository, cabinetRepository, userRepository*/); - lentController = new LentController(/*lentService*/); - } - - @DisplayName("지금부터 대여를 시작한다.") - @Test - void 테스트를_읽어보세요() { - // given - LocalDateTime now = LocalDateTime.now(); - Long ignoreId = 9999L; - boolean banned = true; - boolean notBanned = false; - - User wchae = createAndSave("wchae", notBanned); - User daewoole = createAndSave("daewoole", banned); - User jpark2 = createAndSave("jpark2", notBanned); - - Cabinet cabinet1 = createAndSave(CabinetStatus.FULL); - Cabinet cabinet2 = createAndSave(CabinetStatus.AVAILABLE); - Cabinet cabinet3 = createAndSave(CabinetStatus.AVAILABLE); - - createAndSaveLentHistory(jpark2, cabinet1, now.minusDays(10), 31); - assertThat(lentHistoryRepository.findAll().size()).isEqualTo(1); // NPE가 난다면 무슨 이유일까요? - - LentRequest wrongRequestCabinetAlreadyOccupied = new LentRequest(cabinet1.getCabinetId(), wchae.getUserId(), now); - LentRequest wrongRequestUserAlreadyHasLent = new LentRequest(cabinet2.getCabinetId(), jpark2.getUserId(), now); - LentRequest wrongRequestUserBanned = new LentRequest(cabinet3.getCabinetId(), daewoole.getUserId(), now); - LentRequest validRequestByWchae = new LentRequest(cabinet3.getCabinetId(), wchae.getUserId(), now); - - - // 익셉션은 어떻게 throw 할까요? - assertThatThrownBy(() -> lentController.lent(wrongRequestCabinetAlreadyOccupied)) - .isInstanceOf(RuntimeException.class) - .hasMessage("이미 사용 중인 사물함입니다."); - assertThatThrownBy(() -> lentController.lent(wrongRequestUserAlreadyHasLent)) - .isInstanceOf(RuntimeException.class) - .hasMessage("이미 대여 중인 유저입니다."); - assertThatThrownBy(() -> lentController.lent(wrongRequestUserBanned)) - .isInstanceOf(RuntimeException.class) - .hasMessage("사용 정지상태인 유저입니다."); - LentResponse response = lentController.lent(validRequestByWchae); - - // 컨트롤러 응답 검사 - assertThat(response.getLentHistoryId()).isNotNull(); - assertThat(response.getCabinetId()).isEqualTo(validRequestByWchae.getCabinetId()); - assertThat(response.getUserName()).isEqualTo(wchae.getName()); - assertThat(response.getLentAt()).isEqualTo(validRequestByWchae.getCreatedAt()); - assertThat(response.getExpiredAt()).isEqualTo(validRequestByWchae.getCreatedAt().plusDays(31)); - - // 대여기록 검사 - LentHistory wchaeHistory = lentHistoryRepository.findAll().stream() - .filter(e -> e.getLentUserName().equals(wchae.getName())) - .findAny().orElseThrow(() -> new RuntimeException("테스트 실패 !! 대여 기록이 없습니다!!")); - assertThat(wchaeHistory.getCabinetId()).isEqualTo(validRequestByWchae.getCabinetId()); - assertThat(wchaeHistory.getLentUserName()).isEqualTo(wchae.getName()); - assertThat(wchaeHistory.getCreatedAt()).isEqualTo(validRequestByWchae.getCreatedAt()); - assertThat(wchaeHistory.getExpiredAt()).isEqualTo(validRequestByWchae.getCreatedAt().plusDays(31)); - - // 대여된 사물함 검사 - Cabinet cabinet = cabinetRepository.findAll().stream() - .filter(e -> e.getCabinetId().equals(wchaeHistory.getCabinetId())) - .findAny().orElseThrow(() -> new RuntimeException("테스트 실패 !! 사물함이 없습니다!!")); - assertThat(cabinet.getCabinetStatus()).isEqualTo(CabinetStatus.FULL); - } - - private Cabinet createAndSave(CabinetStatus cabinetStatus) { - Cabinet cabinet = new Cabinet(cabinetStatus); - cabinetRepository.save(cabinet); - return cabinet; - } - - private User createAndSave(String name, boolean isBanned) { - User user = new User(name, isBanned); - userRepository.save(user); - return user; - } - - private LentHistory createAndSaveLentHistory(User user, Cabinet cabinet, LocalDateTime now, int days) { - LentHistory lentHistory = new LentHistory(user.getUserId(), cabinet.getCabinetId(), user.getName(), now, now.plusDays(days)); - lentHistoryRepository.save(lentHistory); - return lentHistory; - } + private LentController lentController; + private LentService lentService; + private UserRepository userRepository; + private LentHistoryRepository lentHistoryRepository; + private CabinetRepository cabinetRepository; + + // 내부 구현을 작성하신 후에, 아래의 주석을 해제해주세요. - 의존성 주입이 뭘까요? + @BeforeEach + public void setUp() { + userRepository = new UserRepository(); + cabinetRepository = new CabinetRepository(); + lentHistoryRepository = new LentHistoryRepositoryImpl(); + lentService = new LentServiceImpl(lentHistoryRepository, cabinetRepository, userRepository); + lentController = new LentController(lentService); + } + + @DisplayName("지금부터 대여를 시작한다.") + @Test + void 테스트를_읽어보세요() { + // given + LocalDateTime now = LocalDateTime.now(); + Long ignoreId = 9999L; + boolean banned = true; + boolean notBanned = false; + + User wchae = createAndSave("wchae", notBanned); + User daewoole = createAndSave("daewoole", banned); + User jpark2 = createAndSave("jpark2", notBanned); + + Cabinet cabinet1 = createAndSave(CabinetStatus.FULL); + Cabinet cabinet2 = createAndSave(CabinetStatus.AVAILABLE); + Cabinet cabinet3 = createAndSave(CabinetStatus.AVAILABLE); + + createAndSaveLentHistory(jpark2, cabinet1, now.minusDays(10), 31); + assertThat(lentHistoryRepository.findAll().size()).isEqualTo(1); // NPE가 난다면 무슨 이유일까요? + + LentRequest wrongRequestCabinetAlreadyOccupied = new LentRequest(cabinet1.getCabinetId(), wchae.getUserId(), + now); + LentRequest wrongRequestUserAlreadyHasLent = new LentRequest(cabinet2.getCabinetId(), jpark2.getUserId(), now); + LentRequest wrongRequestUserBanned = new LentRequest(cabinet3.getCabinetId(), daewoole.getUserId(), now); + LentRequest validRequestByWchae = new LentRequest(cabinet3.getCabinetId(), wchae.getUserId(), now); + + // 익셉션은 어떻게 throw 할까요? + assertThatThrownBy(() -> lentController.lent(wrongRequestCabinetAlreadyOccupied)) + .isInstanceOf(RuntimeException.class) + .hasMessage("이미 사용 중인 사물함입니다."); + assertThatThrownBy(() -> lentController.lent(wrongRequestUserAlreadyHasLent)) + .isInstanceOf(RuntimeException.class) + .hasMessage("이미 대여 중인 유저입니다."); + assertThatThrownBy(() -> lentController.lent(wrongRequestUserBanned)) + .isInstanceOf(RuntimeException.class) + .hasMessage("사용 정지상태인 유저입니다."); + LentResponse response = lentController.lent(validRequestByWchae); + + // 컨트롤러 응답 검사 + assertThat(response.getLentHistoryId()).isNotNull(); + assertThat(response.getCabinetId()).isEqualTo(validRequestByWchae.getCabinetId()); + assertThat(response.getUserName()).isEqualTo(wchae.getName()); + assertThat(response.getLentAt()).isEqualTo(validRequestByWchae.getCreatedAt()); + assertThat(response.getExpiredAt()).isEqualTo(validRequestByWchae.getCreatedAt().plusDays(31)); + + // 대여기록 검사 + LentHistory wchaeHistory = + lentHistoryRepository.findAll().stream() + .filter(e -> e.getLentUserName().equals(wchae.getName())) + .findAny() + .orElseThrow(() -> new RuntimeException("테스트 실패 !! 대여 기록이 없습니다!!")); + assertThat(wchaeHistory.getCabinetId()).isEqualTo(validRequestByWchae.getCabinetId()); + assertThat(wchaeHistory.getLentUserName()).isEqualTo(wchae.getName()); + assertThat(wchaeHistory.getCreatedAt()).isEqualTo(validRequestByWchae.getCreatedAt()); + assertThat(wchaeHistory.getExpiredAt()).isEqualTo(validRequestByWchae.getCreatedAt().plusDays(31)); + + // 대여된 사물함 검사 + Cabinet cabinet = cabinetRepository.findAll().stream() + .filter(e -> e.getCabinetId().equals(wchaeHistory.getCabinetId())) + .findAny().orElseThrow(() -> new RuntimeException("테스트 실패 !! 사물함이 없습니다!!")); + assertThat(cabinet.getCabinetStatus()).isEqualTo(CabinetStatus.FULL); + } + + private Cabinet createAndSave(CabinetStatus cabinetStatus) { + Cabinet cabinet = new Cabinet(cabinetStatus); + cabinetRepository.save(cabinet); + return cabinet; + } + + private User createAndSave(String name, boolean isBanned) { + User user = new User(name, isBanned); + userRepository.save(user); + return user; + } + + //의도.. 된건가요 찾느라 눈알 빠졌습니다 감사합니다 + private LentHistory createAndSaveLentHistory(User user, Cabinet cabinet, LocalDateTime now, int days) { + LentHistory lentHistory = new LentHistory(cabinet.getCabinetId(), user.getUserId(), user.getName(), now, + now.plusDays(days)); + lentHistoryRepository.save(lentHistory); + return lentHistory; + } } diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/build.gradle" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/build.gradle" index 52fd554..ce0eab4 100644 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/build.gradle" +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/build.gradle" @@ -26,6 +26,11 @@ dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + //JPA + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + + // mariadb 의존성 추가 + runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:2.7.9' } tasks.named('test') { diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/docker-compose.yml" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/docker-compose.yml" index 7e40108..5baf0b1 100644 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/docker-compose.yml" +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/docker-compose.yml" @@ -6,7 +6,7 @@ services: restart: always environment: MARIADB_ROOT_USER: root - MARIADB_ROOT_PASSWORD: example + MARIADB_ROOT_PASSWORD: Abcd123@ MARIADB_DATABASE: test ports: - - "3306:3306" \ No newline at end of file + - "3306:3306" diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieRepository.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieRepository.java" deleted file mode 100644 index a1a811c..0000000 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieRepository.java" +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.dongglee; - -import com.example.dongglee.domain.Movie; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface MovieRepository { - List findAll(); - - Movie save(Movie movie); -} diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieService.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieService.java" deleted file mode 100644 index 7ce740d..0000000 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieService.java" +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.dongglee; - -import com.example.dongglee.domain.Movie; -import com.example.dongglee.dto.MovieCreateRequestDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class MovieService { - - private final MovieRepository movieRepository; - - public List getAllMovies() { - return movieRepository.findAll(); - } - - public Movie createMovie(MovieCreateRequestDto dto) { - Movie movie = Movie.builder() - .director(dto.getDirector()) - .title(dto.getTitle()) - .filmedAt(dto.getFilmedAt()) - .build(); - - return movieRepository.save(movie); - } -} diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieController.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/controller/MovieController.java" similarity index 58% rename from "v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieController.java" rename to "v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/controller/MovieController.java" index d2a65f8..d547bc8 100644 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/MovieController.java" +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/controller/MovieController.java" @@ -1,29 +1,29 @@ -package com.example.dongglee; +package com.example.dongglee.controller; import com.example.dongglee.domain.Movie; import com.example.dongglee.dto.MovieCreateRequestDto; +import com.example.dongglee.service.MovieService; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController @RequestMapping("/movies") @RequiredArgsConstructor public class MovieController { - private final MovieService movieService; + private final MovieService movieService; - @GetMapping - public List getMovie() { - return movieService.getAllMovies(); - } + @GetMapping + public List getMovie() { + return movieService.getAllMovies(); + } - @PostMapping - public Movie createMovie(MovieCreateRequestDto dto) { - return movieService.createMovie(dto); - } + @PostMapping + public Movie createMovie(MovieCreateRequestDto dto) { + return movieService.createMovie(dto); + } } diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/domain/Movie.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/domain/Movie.java" index b6db6e3..813b9ee 100644 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/domain/Movie.java" +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/domain/Movie.java" @@ -1,15 +1,31 @@ package com.example.dongglee.domain; -import lombok.Builder; -import lombok.Getter; - +import com.example.dongglee.dto.MovieCreateRequestDto; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import java.time.LocalDateTime; +import lombok.Getter; -@Builder +@Entity @Getter public class Movie { - private Long id; - private String director; - private String title; - private LocalDateTime filmedAt; + @Id + @GeneratedValue + @Column(name = "movie_id") + private Long id; + + private String director; + private String title; + private LocalDateTime filmedAt; + + public static Movie from(MovieCreateRequestDto dto) { + Movie movie = new Movie(); + + movie.director = dto.getDirector(); + movie.title = dto.getTitle(); + movie.filmedAt = dto.getFilmedAt(); + return movie; + } } diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/repository/MovieRepository.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/repository/MovieRepository.java" new file mode 100644 index 0000000..f378496 --- /dev/null +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/repository/MovieRepository.java" @@ -0,0 +1,10 @@ +package com.example.dongglee.repository; + +import com.example.dongglee.domain.Movie; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MovieRepository extends JpaRepository { + +} diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/service/MovieService.java" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/service/MovieService.java" new file mode 100644 index 0000000..88c4361 --- /dev/null +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/java/com/example/dongglee/service/MovieService.java" @@ -0,0 +1,25 @@ +package com.example.dongglee.service; + +import com.example.dongglee.domain.Movie; +import com.example.dongglee.dto.MovieCreateRequestDto; +import com.example.dongglee.repository.MovieRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MovieService { + + private final MovieRepository movieRepository; + + public List getAllMovies() { + return movieRepository.findAll(); + } + + public Movie createMovie(MovieCreateRequestDto dto) { + Movie movie = Movie.from(dto); + + return movieRepository.save(movie); + } +} diff --git "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/resources/application.yml" "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/resources/application.yml" index 1114f65..7936260 100644 --- "a/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/resources/application.yml" +++ "b/v1/backend/SPRING_LV_3_\352\271\200\354\230\201\355\225\234_\354\235\264\353\217\231\354\247\204_\352\267\270\353\246\254\352\263\240/src/main/resources/application.yml" @@ -1,10 +1,20 @@ spring: datasource: driver-class-name: org.mariadb.jdbc.Driver - url: jdbc:mariadb://localhost:3306/test?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + url: jdbc:mariadb://localhost:3306/test?allowPublicKeyRetrieval=true&useSSL=false username: root - password: example + password: Abcd123@ + # datasource: + # driver-class-name: org.h2.Driver + # url: jdbc:h2:mem:;MODE=MySQL + # username: root + # password: test_password jpa: hibernate: - ddl-auto: create \ No newline at end of file + ddl-auto: create + database-platform: org.hibernate.dialect.MariaDBDialect + +logging: + level: + org.springframework.jdbc.datasource: DEBUG \ No newline at end of file