Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 11 additions & 0 deletions week08/keyword/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
- java의 Exception 종류들

Checked Exception : 컴파일 단계에서 반드시 처리해야하는 예외로 외부환경과 관련된 문제가 발생할 때 주로 나타난다. 이 예외는 try-catch로 직접 처리하거나 throws로 호출한 메서드에 명시해야 컴파일이 가능하다.

Unchecked Exception : RuntimeException 계열로 컴파일러가 강제하지 않는 예외이다. 프로그램 내부의 오류나 프로그래머의 실수로 인해 발생하는 경우가 많으며 개발자가 직접 처리하지 않아도 컴파일은 되지만 런타임 시에 프로그램을 종료시킬 수 있으므로 실제 서비스에서는 적절한 예외 처리를 사용하여야한다.

Error: 개발자가 예외 처리로 해결할 수 없는 심각한 문제들을 의미한다 이 오류는 애플리케이션 코드에서 잡거나 복구하려는 시도를 하지 않는 것이 일반적이다. 시스템 자체 문제에 가깝기 때문에 예외 처리를 한다고 해결되는 범주가 아니다.

- @Valid

Bean Validation표준을 사용해 DTO의 필드가 조건에 맞는지 자동 검증 하도록하는 어노테이션이다. 주요 사용 목적으로는 요청 데이터 유효성 검사 자동화 코드 중복 제거 깔끔한 구조 유지 등이 있다.
192 changes: 192 additions & 0 deletions week08/mission/mission.md
Original file line number Diff line number Diff line change
@@ -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<Review, Long> {}
public interface StoreRepository extends JpaRepository<Store, Long> {}
public interface MissionRepository extends JpaRepository<Mission, Long> {}
public interface UserMissionRepository extends JpaRepository<UserMission, Long> {}
public interface UserRepository extends JpaRepository<Member, Long> {}

```

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);
}
}

```
Loading