아래 Controller를 만들고 CreateAddressRequest 클래스에 boolean isDefault 필드를 만들어서 RequestBody 매핑을 시키려 하였다. 하지만 Postman 전송 시 "isDefault" 값을 아무리 true로 던져도 값은 false로 받아지고 이름도 isDefault가 아닌 default로 이름이 바뀌어있었다. 문제는 자바 클래스에서 boolean 필드는 앞에 자동으로 is를 붙여준다는 점이었다. 그리고 boolean 필드는 앞에 이름 get을 붙이지도 않는다. 앞에 is만 붙는다 여기서 이름의 혼선이 생겨 문제가 있었고 해결하기 위해 앞에 is를 빼고 이름을 바꿨다. 이름을 바꿨더니 잘 매핑이 된다.
Mock이란 어떤 행동을 했을 때 어떤 결과값을 줄 건지 정의한 가짜 객체를 뜻하며, Mockito는 Mock을 이용하여 테스트 코드를 작성할 수 있게 해주는 프레임워크이다. 아래 AddressController 파일이 있고 그 안에는 addrSave() 함수로 주소를 저장하는 Service 함수가 실행된다. @RestController @RequiredArgsConstructor public class AddressController { private final AddressService addressService; @PostMapping("/v1/members/{id}/address") public AddressResponse addrSave(@PathVariable("id") Long memberI..
Swagger는 API 문서를 생성하고 관리하는 도구인 API Docs 이다. Swagger가 springfox, springdocs 2종류가 있는데 springfox는 업데이트가 중단돼서 현재는 springdocs만 사용되고 있는 중이다. springfox를 사용해도 되긴 한데 springboot 버전 2점대에서만 사용 할 수 있다. springdocs는 그게 2버전으로 나뉘는데 1.x, 2.x 버전으로 나뉘는데, 1.x 버전은 springboot 버전 2.x 버전에서 사용되고 2.x 버전은 springboot 버전 3.x 버전에서 사용된다. 각 최신 버전은 아래 URL에서 확인할 수 있다. 1.x 버전 공식 문서는 URL : https://springdoc.org/v1/ 2.x 버전 공식 문서 URL..
이 문제를 이해하는데 쫌 시간이 오래 걸렸다. 간단하게 설명하면 각 칸마다 높이가 있고, 물이 0부터 차 올랐을 때 가장 큰 안전영역 개수를 구하면 된다. 물이 4만큼 차 올랐을 때 안전영역은 아래와 같이 구해진다. 만약에 물이 안차오르면 안전영역은 1이다. 그래서 각 칸의 높이가 전부 1이면 답은 1이다. 물의 최대 높이는 지역의 최대 높이이다. 그래서 물의 높이는 0부터 지역의 가장 큰 수만큼 돌려주면 된다. 물의 높이 0도 신경 써야 하는 이유는 메모에 "아무 지역도 물에 잠기지 않을 수도 있다." 는 조건이 있기 때문이다. [전체 풀이 코드] package baekjoon.classfication.dfs; import java.io.BufferedReader; import java.io.Input..
이 문제는 골드5 문제로 일반 사람과 적록 색약 따로 BFS를 돌려서 풀어야 한다. 맨 처음 문제를 해결할 때는 BFS 돌릴 때 분기를 줘서 해결해보려고 했지만 너무 조건문이 복잡해져서 적록 색약 map을 따로 만들고 G를 R로 변경하는 방식으로 바꿨다. 가독성을 위해 조건문은 최대한 2차 까지만 하려고 노력했다. 최대한 깔끔하게 코드를 작성하는 것이 관건인 문제인 것 같다 [풀이 코드] import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; //https://www.acmicpc.net/p..
이 토마토 문제는 골드5 문제로 실버 단계에서 풀던 bfs 공식 으로 풀리지가 않았다. 기존 bfs의 공식이라 함은 for문을 돌아서 1을 찾은 다음 바로 큐에 담고 방문체크를 한 다음에 bfs를 돌리는 것인데 똑같이 이렇게 푸니 절대로 풀리지 않는 문제가 있었다. 기존 풀이 코드 for (int i = 0; i < mapZ; i++) { for (int j = 0; j < mapY; j++) { for (int k = 0; k < mapX; k++) { if (map[i][j][k] == 1 && !isVisited[i][j][k]) { isVisited[i][j][k] = true; bfs(i, j, k); } } } } 직면한 문제와 해결 방법 만약 입력이 아래 처럼 주어졌을 때 밑에 1을 찾아 바..
DB에서 데이터를 조회하는 것은 애플리케이션 서버 안에서 실행되는 메서드 보다 비교도 안될 정도로 시간 비용이 많이 든다. 그래서 DB에서 데이터를 조회하는 것을 최소화하는 것이 성능 최적화의 중요 요점이라고 볼 수 있다. JPA 동작원리 애플리케이션 내에서 EntityManager는 EntityManagerFactory 객체에서 만들어지는데 EntityManagerFactory객체는 한개만 있고 EntityManager는 여러개 만들어 낸다. EntityManager는 한개의 트랜잭션을 가질 수 있다. EntityManager가 관리하는 트랜잭션 내에서 애플리케이션 성능을 높이기 위해 영속성 컨텍스트라는 개념이 나온다. 영속성 컨텍스트란 JPA 내부 동작 방식을 이해하려면 영속성 컨텍스트를 이해해야 하..
@Entity 사용 유의사항 1. @Entity를 매핑해서 사용할 클래스는 기본생성자는 필수다(public 또는 protected 생성자) JPA 구현체들은 클래스의 인스턴스를 생성할 때 기본 생성자를 필요로 한다. 기본 생성자가 없으면 JPA 구현체가 클래스의 인스턴스를 생성할 수 없다. 또한 JPA는 성능 최적화를 위해 프록시 패턴을 사용하는데 프록시 객체를 생성하는데 기본 생성자가 필요하다. 2. Final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. Final 클래스는 상속이 안되므로 프록시 객체를 생성하지 못한다. 3. DB에 저장할 필드에 final을 사용하면 안된다. JPA는 엔티티를 영속성 컨텍스트에서 관리하고 데이터베이스와 상호 작용할 때 필드의 값을 ..
버전및 세팅 Springboot 3.0.2 DB: embadded H2 자바: 17 plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } UUID 적용 사유 아래 처럼 id를 Long 타입으로 주고 글이 하나 생길때마다 하나씩 늘어나는 방식으로 줬다면 글이 총 몇개있는지 파악할 수 있다. 전체 개수가 몇개인지 파악되는 것을 꺼려할수도 있기 때문에 id를 암호화 하거나 UUID로 변경해야 한다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatabl..
https://www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net 이 문제는 (1,1) 위치에서 (N,M) 위치로 가는데 최소 칸수를 구하는 문제이다. 최단 경로 문제는 BFS 를 사용하면 된다고 생각하면 된다. BFS는 갈 수 있는 인접한 경로를 모두 방문하기 때문에 최초 방문된 시점이 출발 노드점에서 갈 수 있는 가장 빠른 경로이기 때문이다. 그래서 이문제도 BFS로 풀면 된다. 최단경로 문제는 BFS로 푼다는 걸 공식처럼 생각하면 된다. 시간 복잡도는 인접 행렬을 사용할거기 때문에 N, ..
Stream은 Java8에서 처음 도입 되었으며, stream은 연속된 데이터들을 처리할 수 있는 기능의 모음이다. stream 작업은 아래 그림과 같이 stream 파이프라인(pipeline)으로 구성되는데 1개의 소스(Array, Collection 등)과 0개이상의 중간 작업과 마지막 1개의 종료 작업으로 끝이 난다. Strem 특징 1. 스트림 소스 생성 종료 작업은 1개만, 중간연산은 여러개 가능하다. 스트림 소스 생성과 종료 작업은 1개만 있을수 있어서 중간 작업과 같이 여러개 있을 수 없다. 만약 한개의 스트림 파이프라인에서 종료 작업을 여러번 하면 에러가 난다. 그리고 중간 작업을 여러번 한다고 해서 원본 소스 데이터를 변경하지 않는다. 2. 지연 연산(LAZY Evaluation) 또한 ..
제네릭스 사용 이유 제네릭스를 알려면 우선 타입변수를 알아야 한다. 타입변수는 일반적으로 제네릭스를 사용하는 ArrayList, Set 등 컬렉션에서 볼 수 있는데, 아래 보이는 가 타입 변수다. 제네릭스를 사용하지 않으면 모든 형태의 데이터를 담을수 있게 Object로 되어 있어야 하고 데이터를 사용하려면 Object의 데이터를 꺼내서 형변환이 필요하고, 또 다른 타입의 데이터를 넣었을때 형변환해서 사용하기 전까지 알수가 없다. List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); 하지만 제네릭스를 사용하면 형변환 할필요가 없고, 데이터를 add 하는 시점에서 데이터 타입이 String이 아니라면 에러가 난다. ..