분류 101

Swagger(SpringDoc OpenAPI 3) 세팅!

OpenAPI 3 라이브러리 선택 이유Spring Boot 3.x부터는 Springfox가 더 이상 공식적으로 지원되지 않아서, 새로운 프로젝트에서는 SpringDoc을 사용하는 게 훨씬 유리하다고 합니다.또한, SpringDoc은 의존성 추가만 하면 자동으로 문서 생성되며, Spring WebFlux도 지원합니다. 의존성 추가(Maven 사용 시) org.springdoc springdoc-openapi-starter-webmvc-ui 2.5.0(Gradle 사용 시)dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0'}  OpenAPI 문서 기본 경로Spring Boot 애플리..

플로이드-워셜

플로이드-워셜 알고리즘최단 거리를 구하는 알고리즘입니다.모든 노드 간의 최단 거리를 탐색 - 매우 중요, 출발 노드가 따로 정해진 것이 없습니다. 특징음수 가중치가 있어도 수행할 수 있습니다.동적 계획법의 원리를 사용합니다.O(NNN) - 노드의 세제곱, 꽤 느립니다. 핵심 이론전체의 최단 경로는, 각 부분의 최단 경로가 합쳐져서 만들어집니다.플로이드 워셜 점화식D[S][E] = Math.min(D[S][E], D[S][K] + D[K][E])리스트를 선언하고 초기화 해줍니다.최단 거리 리스트에 그래프 데이터를 저장합니다.점화식으로 리스트 업데이트합니다.(3중 for 문) for 경유지 K에 관해(1~N):for 출발 노드 S에 관해(1~N): for 도착 노드 E에 관해(1~N): D[S][E] =..

밸만-포드 알고리즘

밸만-포드최단 거리를 구하는 알고리즘입니다. 특징음수 가중치 에지가 있어도 수행할 수 있습니다.전체 그래프에서 음수 사이클의 존재 여부를 파악할 수 있습니다.O(nm) 시간 복잡도 가집니다. 핵심 이론에지 리스트로 그래프를 구현하고 경로 리스트 초기화하기모든 에지를 확인해 정답 리스트 업데이트하기업데이트 반복 횟수 = 노드 수 - 1 음수 사이클이 없을 경우, N-1 에지 사용 횟수를 사용하고 나면, 정답 리스트가 완성된다. 그리고 이렇게 완성된 후, 마지막으로 음수 사이클이 존재하는지 확인한다. 음수 사이클 유무 확인하기모든 에지를 한 번씩 다시 사용해, 업데이트 되는 노드가 발생하는지 확인합니다.업데이트 되는 노드가 있다면, 음수 사이클이 있다는 뜻이 되고, 최단 거리를 찾을 수 없다는 뜻입니다.  ..

[4주 차] 회고

4주 차 미션이 끝났습니다!!!!!!!!!!!!! 프리코스 끝나면 후련할 줄 알았는데, 마지막 미션에서 테스트 케이스 하나도 통과 못한게 너무 아쉬워서 미련만 남습니다.   솔직히 모든 테스트 통과 할 줄 알았는데, 통과 못한게 너무 충격적이었습니다.  진짜 통과 못한 것만 기억에 남아서, 제출 하고도 계속해서 분석했고 답을 찾아냈습니다. 테스트 통과하지 못한 이유 분석  이번 요구사항 중에, resourse 패키지 안에 들어있는 products.md , promotions.md 파일의 정보를 읽어와 데이터를 읽어들이는 요구사항이 있었습니다. 그래서 저는 해당 파일이 들어있는 경로를 복사하여 객체에 주입함으로서, 데이터를 받도록 하였습니다. 하지만 파일 경로를 제 컴퓨터 경로가 포함된 절대 경로로 설정한..

[3주 차] 회고

어느덧, 벌써 3주 차 미션이 끝났네요. 2주 차 미션과 비교하면 훨씬 어려운 수준이긴 했지만,  그만큼 구현하는 재미가 있었습니다. 제출하고 나면, 부족했던 부분들을 정리하는 시간을 가지는데, 이 시간이 이번 미션에 많은 도움이 되었습니다.정말 돌아보는 시간이 중요하다는 것을 다시 한 번 깨닫게 되는 것 같아요. 이번 미션은, TDD를 도전해 봤습니다. 2주 차 때, 운좋게 박재성님의 TDD 리팩토링 강의를 접하게 되었는데, 이번 프로그램 요구사항에 "테스트 공간을 확보하라" 라는 요구사항을 보며 TDD를 해봐야겠다고 생각했습니다. 못했던 점정말 TDD를 하면서, 도메인을 분석하는 시간이 정말 중요하다는 것을 느꼈습니다. 그냥 도메인을 나누는 것이 아니라, 정말 정말 정말 세세하게 해당 도메인이 무슨 ..

[3주 차] 정적 팩토리 메서드

정적 팩토리 메서드에 대해 학습한 이유2주 차 코드를 다시 한번 리뷰하면서 문제점을 발견하게 되었습니다. CarName과 같이 원시값 포장한 객체의 경우 검증 로직을 생성자 안에 정의하였는데, 생성자의 책임은 객체를 초기화 하는 것에만 있다는 것을 간과하였습니다. 따라서, 검증 로직에 대한 책임도 가지고 있고 생성자를 만들어 낼 수 있는 방법에 대해 찾게 되었고, 정적 팩토리 메서드를 접하게 되었습니다. 정적 팩토리 메서드란 무엇일까?정적 팩토리 메서드란 쉽게 말해 생성자로 인스턴스를 생성하지 않고, static Method를 사용해 인스턴스를 생성하는 방식입니다. 정적 팩토리 메서드를 사용하는 이유정적 팩토리 메서드를 사용하는 이유는 여러 가지가 있습니다. 1. 이름을 가질 수 있기에 명확한 의도를 전..

[3주 차] TDD

TDD 에 대해 학습한 이유3주 차 학습 목표 중 하나가 "클래스와 함수에 대한 단위 테스트를 통해 의도한 대로 정확하게 작동하는 영역을 확보한다." 입니다.해당 문구를 접하였을 때, 함수를 작성할 때마다 테스트 코드를 작성하라는 의미로 파악하였고, 2주 차때 접한 TDD 강의가 생각났습니다.학습 목표에 따라, 목표를 달성하기 위해 TDD 가 무엇인지에 대해 정리하게 되었습니다.  TDD(테스트 주도 개발) 란 무엇인가?TDD란 테스트 주도 개발입니다. 메서드마다 작은 테스트 케이스를 작성하면서 이를 통과하는 코드를 추가해 나갑니다.TDD, 리팩토링 == 운동 : 평생동안 연습하겠다는 마음으로 시작해야 합니다 어떤식으로 테스트 코드를 작성해야 하는가실패하는 테스트 코드를 만듭니다.성공하는 테스트 코드를 ..

[2주 차] 상수에 static 선언을 하는 이유에 대하여 - 1주 차 코드리뷰

1주 차 피드백에 다음과 같은 피드백이 달리게 되었습니다.  해당 부분은 다른 분들도 많이 궁금해하실 것 같아 따로 정리하게 되었습니다!  Staticstatic 키워드는 클래스 단에서 공유되는 요소를 만들기 위해 사용됩니다. 변수를 선언하므로써, 모든 객체가 동일한 변수를 공유할 수 있다는 말입니다.  따라서 static 키워드를 사용하게 되면, 클래스가 처음 로드될 때, 단 한 번만 메모리에 할당되어 변수를 공유할 수 있게 됩니다. static 키워드를 사용하지 않은 변수들은 객체를 생성할 때 마다, 새로운 메모리를 할당하기 때문에 비효율적입니다. fianlfinal 키워드는 할당된 값이 변경되지 않도록 만드는 역할을 합니다.  만일, final 키워드를 이용하여 상수를 선언하면, 초기화 이후 값을 ..

[2주 차] 회고

저번 주에는 정말 정신이 없어서, 지금에서야 2주 차 회고를 하게 되었습니다. 사실 미리 작성해 두긴 했는데, 지금에서야 올려요 ㅎㅎ..  2주 차 미션은 자동차 경주 미션이였습니다. 되돌아보면, 뭔가 슥슥 빠르게 작성은 되었는데, 디테일한 부분을 많이 놓친 느낌입니다. 저는 스프링을 시작한지는 겨우 2달이 되었고, 자바를 시작한 지는 6개월 정도 된 것 같습니다. 본격적으로 시작한거요!기본적으로 자바도 스프링처럼 MVC 패턴으로 작성하고자 했습니다. 이런식으로요! 그래서 MVC 패턴에 대해서도 다시 공부하고, 1주 차 코드를 보면서 어떤 부분을 고쳐야 할지 많이 고민했던 것 같습니다. 특히 신경썼던 점은, 의존성을 많이 끊어내려고 노력했습니다. 의존하게 된다면 MVC 패턴으로 구현하는 이유가 없다고 생..

[2주 차] Junit5 Parameterized Test

Junit5 Parameterized Test 1. 첫 번째 예제@ParameterizedTest@ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) // 6개의 정수void isOdd_ShouldReturnTrueForOddNumbers(int number) { assertTrue(Numbers.isOdd(number));}해당 테스트 메서드는 총 6번 실행됩니다.각 실행시 ValueSource 의 값을 매개 변수로 받습니다.  2. 인수 소스 2.1 간단한 값@ParameterizedTest@ValueSource(strings = {"", " "})void isBlank_ShouldReturnTrueForNullOrBlankStrings(Str..