//////
Search
🗒️

황민우

날짜
2022/11/25
작성자
황민우
카테고리
회고

알고리즘

최대공약수 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
복사