일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- DFS
- 그리디
- 유니온파인드
- 코드트리
- 그래프
- 자바
- 코딩테스트
- BFS
- 완전탐색
- 기본유형
- JPA
- 싸피
- 백준
- 코테
- SSAFY
- Java
- Spring
- 부분수열의합2
- database
- 알고리즘기본개념
- Union Find
- SWEA
- 완탐
- 다익스트라
- 알고리즘
- DP
- 다시보기
- 트러블슈팅
- 코딩테스트실력진단
- JUnit
- Today
- Total
목록전체 글 (159)
HwangHub
엔티티 조회 방식 XToOne 필드에 대하여 JOIN FETCH를 적용하고, 연관관계 컬렉션 필드(XToMany)에 대해서는 batch size를 설정하는 방법을 이용하여 엔티티 조회 방식에 최적화를 이뤄낼 수 있었다. 이는 JPA에서 제공해주는 기능을 적극적으로 활용한 로직이므로, 유지보수시에 코드를 거의 수정하지 않고 옵션만 약간 변경해서 적용해가며 다양한 성능 최적화를 시도할 수 있다. /** * V3.1 엔티티를 조회해서 DTO로 변환 페이징 고려 * - ToOne 관계만 우선 모두 페치 조인으로 최적화 * - 컬렉션 관계는 hibernate.default_batch_fetch_size, @BatchSize로 최적화 */ @GetMapping("/api/v3.1/orders") public Lis..
문자열 String 자바에서는 String이라는 객체를 통해서 문자열을 저장한다. 하지만 유독 문자열은 다른 자바 객체와는 다르게 구현되어 있다. 인간이 자바를 통해 가장 많이 사용하는 객체인 String은 우리가 일반적으로 객체를 생성할 때 사용하는 new 연산자를 사용하지 않고 바로 문자열 값을 할당하여 사용한다. (new 연산자를 사용해서 객체를 생성할 순 있지만, 권장하지 않는다.) String 변수에 값을 바로 할당하여 생성하는 것을 문자열 리터럴 생성이라고 부른다. public void string() { String name = "lxxjn0"; // 문자열 리터럴 생성 String name1 = new String("lxxjn0"); // new 연산자를 이용한 문자열 생성 } String..
이제부터 언급할 repository는 entity를 조회하는 dao 코드를 담는 패키지, 그리고 dto와 관련되어 화면을 구성하는 레벨의 모듈을 담는 패키지는 query라고 한다. 위와 같이, repository와 query를 구분할 경우, 관심사를 분리하는 효과를 얻을 수 있어 유지보수성이 증가한다. 주로 entity를 직접 조회하고 수정하는 dao의 경우에는 핵심 비즈니스 로직을 수행할 때 사용되며, query와 같은 경우는 클라이언트로 반환하기 위해 dto를 사용한다. 즉, 화면 구성을 위한 object를 다루기 때문에 화면과 관련된 것들을 파악할 때에는 query 패키지만 확인해 주면 된다. 이렇게 관심사를 명확히 분리하면, 1. 향후 문제가 발생했을 때 파악하기도 용이할 뿐만 아니라, 2. 핵심..
엔티티를 조회할 때, 컬렉션 필드의 경우 LAZY Loading을 피하겠다는 의도로 JOIN FETCH를 하면 데이터가 뻥튀기되는 문제가 발생한다. 또한 페이징을 수행하는 것이 (거의) 불가능하다는 것이 문제였다. 이를 해결하기 위해서는 LAZY Loading을 그냥 적용하되, 한 번에 일정 사이즈를 fetch하는 것(==batch)으로 하면 해결된다. 단, XToOne 관계 필드는 JOIN FETCH하여도 문제가 발생하지 않으므로, 가급적 XToOne 필드에 대해서는 JOIN FETCH를 적용하는 것을 적극 권장한다. /** * V3.1 엔티티를 조회해서 DTO로 변환 페이징 고려 * - ToOne 관계만 우선 모두 페치 조인으로 최적화 * - 컬렉션 관계는 hibernate.default_batch_..
장점 만약 어떤 엔티티의 dto를 조회한다고 했을 때, 해당 엔티티의 필드 중 어떤 엔티티가 컬렉션으로 연관관계가 묶여 있을 경우 이 조회 기능에 fetch join을 사용하지 않고 dto로 변환하고자 한다면, 이 과정에서 LAZY인 연관관계를 조회하기 위해 무수히 많은 쿼리문이 발생할 것이다. (1+N 이슈) @GetMapping("/api/v2/orders") public List ordersV2() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } public List findAll() { return em..
SSH Secure Shell (Protocol)의 줄임말로, 두 컴퓨터 간 통신을 할 수 있게 해주는 하나의 프로토콜입니다. 우리들은 이미 HTTP, HTTPS 등의 프로토콜을 사용하여 다른 컴퓨터에 요청을 보내고 받는 작업을 수없이 하고 있죠. 서로 다른 컴퓨터 간 웹 페이지를 요청하고 받기 위해 브라우저를 사용하여 통신할 때 HTTP 또는 HTTPS를 사용하듯이, 데이터 전송과 원격 제어를 하기 위해 서로 다른 컴퓨터 간 shell을 통해 통신합니다. SSH 통신의 목적 데이터 전송 원격 제어 우리가 가장 일반적으로 마주할 수 있는 SSH 통신은 GitHub 등의 원격 레포지토리에 소스코드 파일을 push와 pull할 때 일어납니다. 또한 AWS와 같은 클라우드 서비스를 이용할 때 EC2와 같은 인..
BFS 너비 우선 탐색은 출발점에서 가장 가까운 노드부터 방문하며, 차례대로 모든 노드를 방문하는 알고리즘입니다. 따라서 원하는 위치가 있고, 그 위치까지 도달하는 데에 걸리는 최소 시간 또는 최단 경로를 구하고 싶다면 BFS가 적절합니다. BFS는 FIFO 구조인 Queue를 사용하여 로직을 구성하며, 자바에서는 LinkedList()로 Queue를 구현합니다. 그래프 문제의 공통점이지만, 이미 방문한 노드는 다시 방문하지 않을 예정이므로, 이를 감안하여 로직을 구성해야 합니다. 주로 길찾기 문제를 BFS로 풉니다. 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. w..
https://www.acmicpc.net/problem/3029 3029번: 경고 첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다. 둘째 줄에는 나트륨을 던질 시간 www.acmicpc.net 문제 해석 시계 문제로, 그냥 단순히 '기다리기 시작한 시간' 과 '폭탄을 던지는 시간'을 시간으로 관리하고 뺄셈만 해주면 되는 문제다. 문제 풀이 첫 번째 시도 h1, m1, s1 = map(int, input().split(":")) h2, m2, s2 = map(int, input().split(":")) start_time = h1 * 3600 + m1 * 60 + s1 ..
많은 것으로 가득 채웠던 2022년이 저물었고 2023년이 밝았다. 참 무겁고, 의미가 깊은 한 해였다. 좋은 사람들을 만나고, 좋은 인연을 만났다. 기회는 준비된 자만이 알아볼 수 있고, 도전하는 자만이 잡을 수 있으며, 노력하는 자만이 이어 나갈 수 있다. 항상 좋은 사람들과 좋은 기회를 놓치지 않기 위해 늘 깨어있으라. 올해 목표는 무척이나 강력하고 원대하다. 1. AWS SAA 아키텍트 자격증 취득 2. 소프트웨어 마에스트로 부트캠프 도전 3. 항공대 멋사 성공적으로 마무리(1년 프로젝트 배포 및 운영 + 소프트웨어 학술제 완수) 4. 산학프로젝트1 수상 (수강학점 부족...으로 수정 2023-01-05) 5. 캡스톤(종설) 성공적으로 마무리 6. 코알라 코테반 수료 7. 이 모든 과정을 잘 기록..