diff --git a/week08/keyword/keyword.md b/week08/keyword/keyword.md new file mode 100644 index 0000000..9aca002 --- /dev/null +++ b/week08/keyword/keyword.md @@ -0,0 +1,11 @@ +- java의 Exception 종류들 + + Checked Exception : 컴파일 단계에서 반드시 처리해야하는 예외로 외부환경과 관련된 문제가 발생할 때 주로 나타난다. 이 예외는 try-catch로 직접 처리하거나 throws로 호출한 메서드에 명시해야 컴파일이 가능하다. + + Unchecked Exception : RuntimeException 계열로 컴파일러가 강제하지 않는 예외이다. 프로그램 내부의 오류나 프로그래머의 실수로 인해 발생하는 경우가 많으며 개발자가 직접 처리하지 않아도 컴파일은 되지만 런타임 시에 프로그램을 종료시킬 수 있으므로 실제 서비스에서는 적절한 예외 처리를 사용하여야한다. + + Error: 개발자가 예외 처리로 해결할 수 없는 심각한 문제들을 의미한다 이 오류는 애플리케이션 코드에서 잡거나 복구하려는 시도를 하지 않는 것이 일반적이다. 시스템 자체 문제에 가깝기 때문에 예외 처리를 한다고 해결되는 범주가 아니다. + +- @Valid + + Bean Validation표준을 사용해 DTO의 필드가 조건에 맞는지 자동 검증 하도록하는 어노테이션이다. 주요 사용 목적으로는 요청 데이터 유효성 검사 자동화 코드 중복 제거 깔끔한 구조 유지 등이 있다. \ No newline at end of file diff --git a/week08/mission/mission.md b/week08/mission/mission.md new file mode 100644 index 0000000..d2ff8da --- /dev/null +++ b/week08/mission/mission.md @@ -0,0 +1,192 @@ +POST /api/reviews + +Request Body + +```java +{ + "userMissionId": "1", + "storeId": "20", + "rating": 5, + "content": "음식이 맛있어요" +} +``` + +DTO + +```java +public record ReviewCreateRequest( + Long userMissionId, + Long storeId, + int rating, + String content +) {} +``` + +Entity + +UserMission + +```java +@Entity +public class UserMission { + @Id @GeneratedValue + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Mission mission; + + @ManyToOne(fetch = FetchType.LAZY) + private Member user; + + private boolean completed; + +} +``` + +Review + +```java +@Entity +public class Review { + + @Id @GeneratedValue + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Member writer; + + @ManyToOne(fetch = FetchType.LAZY) + private Store store; + + @ManyToOne(fetch = FetchType.LAZY) + private UserMission userMission; + + private int rating; + private String content; + private LocalDateTime createdAt = LocalDateTime.now(); +} + +``` + +Repository + +```java +public interface ReviewRepository extends JpaRepository {} +public interface StoreRepository extends JpaRepository {} +public interface MissionRepository extends JpaRepository {} +public interface UserMissionRepository extends JpaRepository {} +public interface UserRepository extends JpaRepository {} + +``` + +Service + +StoreReview + +```java +@Service +@RequiredArgsConstructor +public class ReviewService { + + private final UserRepository userRepository; + private final StoreRepository storeRepository; + private final UserMissionRepository userMissionRepository; + private final ReviewRepository reviewRepository; + + private static final Long USER_ID = 1; + + public Long createReview(ReviewCreateRequest req) { + + Member user = userRepository.findById(USER_ID) + .orElseThrow(() -> new IllegalArgumentException("User Not Found")); + + Store store = storeRepository.findById(req.storeId()) + .orElseThrow(() -> new IllegalArgumentException("Store Not Found")); + + UserMission userMission = userMissionRepository.findById(req.userMissionId()) + .orElseThrow(() -> new IllegalArgumentException("UserMission Not Found")); + + Review review = new Review(); + review.setWriter(user); + review.setStore(store); + review.setUserMission(userMission); + review.setRating(req.rating()); + review.setContent(req.content()); + + Review saved = reviewRepository.save(review); + + return saved.getId(); + } +} + +``` + +UserMission + +```java +@Service +@RequiredArgsConstructor +public class MissionChallengeService { + + private final MissionRepository missionRepository; + private final UserMissionRepository userMissionRepository; + private final UserRepository userRepository; + + private static final Long USER_ID = 1; + + public Long challengeMission(Long missionId) { + + Member user = userRepository.findById(USER_ID) + .orElseThrow(() -> new IllegalArgumentException("User Not Found")); + + Mission mission = missionRepository.findById(missionId) + .orElseThrow(() -> new IllegalArgumentException("Mission Not Found")); + + UserMission userMission = new UserMission(); + userMission.setMission(mission); + userMission.setUser(user); + userMission.setCompleted(false); + + UserMission saved = userMissionRepository.save(userMission); + return saved.getId(); + } +``` + +Controller + +Review + +```java +@RestController +@RequestMapping("/api/reviews") +@RequiredArgsConstructor +public class ReviewController { + + private final ReviewService reviewService; + + @PostMapping + public ResponseEntity createReview(@RequestBody ReviewCreateRequest req) { + Long reviewId = reviewService.createReview(req); + return ResponseEntity.ok("리뷰 등록 성공! id = " + reviewId); + } +} +``` + +Mission + +```java +@RestController +@RequestMapping("/api/missions") +@RequiredArgsConstructor +public class MissionChallengeController { + + private final MissionChallengeService missionChallengeService; + + @PostMapping("/{missionId}/challenge") + public ResponseEntity challenge(@PathVariable Long missionId) { + Long id = missionChallengeService.challengeMission(missionId); + return ResponseEntity.ok("미션 도전 시작! userMissionId = " + id); + } +} + +``` \ No newline at end of file