알고리즘
최대공약수 GCD
성질
1.
a 와 b 가 같으면 최대 공약수는 a 이다.
2.
두 수 a, b가 다를 때 작은 수 a에 큰 수 b를 더한 수와 작은 수 a의 최대 공약수는 같다.
a.
a 와 b의 최대 공약수와 a와 a+b의 최대 공약수는 같다.
3.
두 수 a, b가 다를 때 큰 수 b에 작은 수 a를 뺀 수와 작은 수 a의 최대 공약수는 같다.
a.
a 와 b의 최대 공약수와 a와 b-a의 최대 공약수는 같다.
4.
a와 b의 최대 공약수와 b와 a의 최대 공약수는 같다.
알고리즘
1.
큰 수에서 작은 수를 뺀다. → 3번 성질
2.
두 수가 같아지면 반환한다. → 1번 성질
코드
public class GCD {
public static void main(String[] args) {
int gcd = gcd(32, 72);
int gcd2 = gcd2(32, 72);
System.out.println(gcd);
System.out.println(gcd2);
}
private static int gcd(int a, int b) {
if (a == b) return a; // a, b가 같으면 재귀 호출 종료
if (a > b) return gcd(b, a); // 첫 번째 인자가 크면 두 번째 인자와 자리를 바꿔 다시 호출.
return gcd(a, b - a); // 두 번째 인자가 큰 경우 큰 수에서 작은 수를 빼 다시 호출.
}
}
JavaScript
복사
이 코드의 실행 결과는?
public static void recur(int n) {
if (n <= 0) return;
recur(n - 1);
System.out.println(n);
recur(n - 2);
}
public static void main(String[] args) {
recur(3);
}
Java
복사
꼬리 재귀 제거
public static void recur(int n) {
if (n <= 0) return;
recur(n - 1);
System.out.println(n);
recur(n - 2);
}
public static void main(String[] args) {
recur(3);
}
Java
복사
public static void recur(int n) {
while (n > 0) {
recur(n - 1);
System.out.println(n);
n = n - 2;
}
}
public static void main(String[] args) {
recur(3);
}
Java
복사
SpringBoot
new 어노테이션
@RequiredArgsConstructor
필요한 인자들로 생성자를 만드는 어노테이션
필요한 인자?
여기서 필요한 인자라는 것은 final이 붙어있지만 초기화 되지 않은 필드를 말합니다.
@RequiredArgsContructor 적용
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/v1/reviews")
public class ReviewApiController {
private final ReviewService reviewService;
private Something something;
// ...
}
Java
복사
@RequiredArgsContructor 미적용
@RestController
@RequestMapping("/api/v1/reviews")
public class ReviewApiController {
private final ReviewService reviewService;
private Something something;
public ReviewApiController(ReviewService reviewService) {
this.reviewService = reviewService;
}
// ...
}
Java
복사
@RequiredArgsContructor 제외되는 필드
1.
final이 붙지 않은 필드
2.
final이 붙어 있고 이미 초기화 된 필드
Optional
Optional은 왜 사용하나요? null을 피하기 위해 사용합니다.
Optional 메소드
1.
isEmpty()
a.
값이 있는지 없는지 확인하는 메서드
b.
값이 없으면(null)이면 true, 값이 있으면 false
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
if (optionalHospital.isEmpty()) {
// ...
}
Java
복사
2.
isPresent()
a.
값이 있는지 없는지 확인하는 메서드
b.
값이 있으면 true, 값이 없으면 false
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
if (optionalHospital.isPresent()) {
// ...
}
Java
복사
3.
get()
a.
값을 가져오는 메서드
b.
값이 없으면 NoSuchElementException 예외 발생
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
Hospital hospital = optionalHospital.get(); // 값이 없으면 예외 발생
Java
복사
c.
따라서 isEmpty() 나 isPresent() 로 값이 있는지 확인이 필요.
Optional<Hospital> optionalHospital = hospitalRepository.findById(id);
Hospital hospital = null;
if (optionalHospital.isPresent()) { // 값이 있는지 확인 후
hospital = optionalHospital.get(); // 값을 가져옴
}
Java
복사
4.
orElseThrow()
a.
값을 가져오는 메서드
b.
값이 없으면 원하는 예외를 발생시키는 메서드
Hospital hospital = hospitalRepository.findById(id).orElseThrow(() -> new RuntimeException("해당 병원 정보를 찾을 수 없습니다."));
Java
복사
5.
orElse()
a.
값을 가져오는 메서드
b.
값이 없으면 특정 값을 반환하는 메서드
Hospital hospital = hospitalRepository.findById(id).orElse(new Hospital());
Java
복사
리뷰 조회 기능
1개 조회 기능
Endpoint
GET /api/v1/reviews/{id}
ReviewService
public Review findById(Long id) {
return reviewRepository.findById(id).orElseThrow(() -> new RuntimeException("해당 리뷰를 찾을 수 없습니다.");
}
Java
복사
ReviewController
@GetMapping("/{id}")
public ResponseEntity<ReviewResponse> findById(@PathVariable("id") Long id) {
Review review = reviewService.findById(id);
return ResponseEntity.ok(ReviewResponse.of(review));
}
Java
복사
ReviewResponse
@Builder
@AllArgsConstructor
@Getter
public class ReviewResponse {
// 필드 생략...
public static ReviewResponse of(Review review) { // Review Entity를 ReviewResponse DTO로 변환하는 static 메서드
return ReviewResponse.builder()
.id(review.getId())
.title(review.getTitle())
// ...
.build();
}
}
Java
복사
해당 병원의 리뷰만 조회 하는 기능
Endpoint
GET /api/v1/hospitals/{id}/reviews
ReviewRepository
public interface ReviewRepository extends JpaRepository<Review, Long> {
List<Review> findByHospital(Hospital hospital);
}
Java
복사
ReviewService
public List<Review> findAllByHospitalId(Long hospitalId) {
Hospital hospital = hospitalRepository.findById(hospitalId).orElseThrow(() -> new RuntimeException("해당 병원을 찾을 수 없습니다.");
return reviewRepository.findByHospital(hospital);
}
Java
복사
HospitalController
@GetMapping("/{id}/reviews")
public ResponseEntity<List<ReviewResponse>> findAllByHospitalId(@PathVariable("id") Long hospitalId) {
List<Review> reviews = reviewService.findAllByHospitalId(hospitalId);
List<ReviewResponse> reviewsResponse = reviews.stream().map(ReviewResponse::of).collect(Collectors.toList());
return ResponseEntity.ok(reviewsResponse);
}
Java
복사
병원 정보와 함께 조회 기능
Endpoint
GET /api/v1/hospitals/{id}
HospitalResponseWithReview
@Builder
@AllArgsConstructor
@Getter
public class HospitalResponseWithReview {
private Integer id;
private String hospitalName;
private String fullAddress;
private String roadNameAddress;
private Integer healthcareProviderCount;
private Integer patientRoomCount;
private Float totalAreaSize;
private Boolean shutDown;
private List<ReviewResDTO> reviews;
public static HospitalResponseWithReview of(Hospital hospital) {
return HospitalResponseWithReview.builder()
.id(hospital.getId())
.hospitalName(hospital.getHospitalName())
.fullAddress(hospital.getFullAddress())
.roadNameAddress(hospital.getRoadNameAddress())
.healthcareProviderCount(hospital.getHealthcareProviderCount())
.patientRoomCount(hospital.getPatientRoomCount())
.totalAreaSize(hospital.getTotalAreaSize())
.shutDown(hospital.isShutDown())
.reviews(hospital.getReviews().stream().map(ReviewResponse::of).collect(Collectors.toList()))
.build();
}
}
Java
복사
HospitalService
public Hospital findById(Integer id) {
return hospitalRepository.findById(id).orElseThrow(() -> new RuntimeException("해당 병원을 찾을 수 없습니다."));
}
Java
복사
HospitalController
@GetMapping("/{id}")
public ResponseEntity<HospitalResponseWithReview> findById(@PathVariable("id") Long id) {
Hospital hospital = hospitalService.findById(id);
return ResponseEntity.ok(HospitalResponseWithReview.of(hospital));
}
Java
복사