전체 글

상속관계 매핑
객체지향은 상속관계가 존재하지만 RDB는 상속 관계가 없다. RDB에는 슈퍼타입/서브타입 관계같은 상속 관계와 비슷한 모델링 기법이 있다. 물품을 RDB 논리 모델링을 진행하는 경우 물품 > 음반, 영화, 책 → 공통된 데이터를 물품이 갖는다 (슈퍼타입 / 서브타입) 슈퍼타입/서브타입 → 객체 상속관계 변환 방법 조인 전략 : 슈퍼타입용 테이블과 서브타입 테이블을 따로 구성하고, 슈퍼타입 테이블에 구분 컬럼을 둔다. 정규화가 잘 된 테이블 전략이다. 단일 테이블 전략 (Default) : 서브타입 테이블 컬럼을 슈퍼타입 테이블 하나에 모은다. 구분 컬럼을 둔다. 성능적인 측면에서 장점이 있다. 구현 클래스 별 테이블 전략 : 슈퍼타입의 공통 데이터를 서브타입 테이블에 컬럼으로 넣어 사용한다. 조인 전략 ..

Stream API 무작정 연습하기!
Java 8 부터 람다 표현식, Stream API, 함수형 인터페이스를 지원하기 시작했다. Stream API는 데이터를 추상화하고, 가공하여 데이터를 처리할 수 있게 하는 메서드들을 정의해놓은 Java에서 지원하는 API이다. 스트림 API의 특징 기존 데이터로 부터 생성된 스트림 데이터는 별도의 데이터로 생성되기 때문에 기존 데이터는 변경되지 않는다. List stringList = List.of("zayson", "maeng", "joon"); Stream stringStream = stringList.stream().sorted(); // 기존 데이터로부터 생성한 스트림 stringStream.forEach(System.out::println); // 기존 데이터가 변경되지 않는다. for (S..

Kotlin 맛보기 - 변수
코틀린은 변수 선언 시 var, val을 사용한다. var : Variable, 수정 가능한 가변 변수 val : Value, Read-Only인 불변 변수 (Java의 final ) // Kotlin var number1 = 10L // 가변 number1 = 20L val number2 = 10L // 불변 numbre2 = 20L // 에러 // Java long number1 = 10L; numbre1 = 20L; final long number2 = 10L; number2 = 20L; 코틀린은 타입을 컴파일 시점에 추론하기 때문에 타입을 작성하지 않아도 되지만, 변수 : 타입으로 지정하는 것이 가능하다. // Kotlin var number1: Int = 10 // Java int number1..

Repository 단위 테스트
@DataJpaTest와 @AutoConfigureTestDatabase를 이용해 Repository 메서드를 단위 테스트해보자. @DataJpaTest 기본적으로 JPA 관련 설정들을 로드한다. 기본적으로 인메모리 테스트 데이터베이스를 이용해 실제 데이터베이스를 이용하지 않고 사용하는 것이 가능하다. 또한, @Tranasactional을 가지고 있기 때문에 테스트가 진행된 이후 자동으로 롤백하는 것이 가능하다. @AutoConfigureTestDatabase 애노테이션 뜻 그대로 테스트 데이터베이스의 구성정보를 자동으로 설정해주는 애노테이션이다. 이 또한, @DataJpaTest에 가지고 있다. 위에서 기본적으로 인메모리 테스트 데이터베이스를 이용한다고 한 부분이 @AutoConfigureTestDat..
![[API 고급] 컬렉션 조회 최적화](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKgSxz%2FbtrG6XVDfur%2FDIjIpIwL7Kl1lyJrX0Ffk0%2Fimg.png)
[API 고급] 컬렉션 조회 최적화
“김영한 강사님의 JPA 활용편 2 - API 개발과 성능 최적화"를 듣고 간단하게 정리하기” OneToOne, ManyToOne과 같은 경우는 Fetch Join을 해주는 것으로 성능을 최적화 하는 것이 가능하다. ToMany(OneToMany)의 경우에는 Join을 하는 경우 N개의 컬럼으로 늘어나기 때문에 최적화에 어려움이 있다. Ex. 주문과 주문상품 관계로 주문 조회를 최적화 주문과 배송, 회원(ToOne관계), 주문상품(ToMany)을 조회한다. V1 : 엔티티를 직접 노출 (안좋은 방법) 주문상품과 주문한 상품의 상세 정보를 가져오기 위해서 Lazy 로딩이 설정되어 있는 프록시의 강제 초기화가 필요하다. 아래의 방법은 엔티티를 직접 노출하기 때문에 DTO로 변환해서 데이터를 화면에 전달해야한..
![[백준, Java] 5557번 : 1학년](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5wPne%2FbtrGTwkcTDl%2FgDCmf8JyQyfgRgGUGIjX5K%2Fimg.gif)
[백준, Java] 5557번 : 1학년
🔗 문제 링크 https://www.acmicpc.net/problem/5557 😮 문제 해결 방법 처음부터 숫자를 더하거나 빼면서 그 값이 0이상 20이하가 되어야 한다. 완전탐색으로 문제를 풀기에는 경우의 수가 무수히 많기 때문에 DP를 이용한다. dp 배열의 사이즈는 마지막 숫자를 제외한 숫자의 개수, 0 - 20까지 경우의 수를 저장하게 dp[N-1][21]로 지정한다. 마지막 숫자는 수식의 = 이되기 때문에 마지막 숫자는 배열에서 제외한다. 배열에는 매 인덱스 별 계산한 결과값의 경우의 수가 저장되어있다. 따라서, N-1 인덱스까지 숫자의 인덱스를 옮겨가면서 이전 인덱스까지 결과값 0에서 20까지의 경우의 수 중 1번 이상 결과가 나온 값을 더하거나 빼준다. 더하거나 빼준 값이 다시 0이상 20..
![[프로그래머스, Java] 땅따먹기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxsaqr%2FbtrGSyitJ3d%2FUEQckHOxiXQdpwt8yc1Yjk%2Fimg.gif)
[프로그래머스, Java] 땅따먹기
🔗 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/12913 😮 문제 해결 방법 간단한 DP문제이다. 현재 스텝의 열에서 최대의 점수를 얻기 위해선 이전 스텝까지의 열 중에서 현재 내가 밟고 있지 않은 열의 최대 점수값을 더해준다. 만약 2번째 스텝의 1번째 열의 최대값을 구하고 싶다면, 1번째 스텝까지의 2,3,4열의 최대값에 현재 밟은 칸의 점수를 더해주면 최댓값이 된다. 이러한 방식을 통해 점화식을 세우면 dp[step][열] = arr[step][열] + max(dp[step-1][열에 해당하지 않는 열])이 된다. dp[step-1][열에 해당하지 않는 열]의 경우 열이 4개가 있기 때문에 max안에 들어가는 dp의 개수는 3개..
![[프로그래머스, Java] 방문 길이](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGc7gk%2FbtrGTxiNHvs%2Fwt4RltJEAr1rkPKkB384xk%2Fimg.gif)
[프로그래머스, Java] 방문 길이
🔗 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/49994 😮 문제 해결 방법 좌표를 하나의 행렬로 이용하기 위해서 10 * 10지도를 11 * 11 좌표로 변환해서 사용했다. 첫 시작 위치는 (5,5)에서 시작하고 상, 하, 좌, 우로 이동하는 경우에 해당 경로를 이용했음을 체크해주는 배열을 생성한다. 배열은 3차원 배열을 사용해 좌표의 행렬과 방향을 표시한다. 3차원 배열을 이용함으로 써 이미 방문한 좌표의 경우에도 방향이 다르면 새로운 경로임을 판단할 수 있다. 이 부분에서 키 포인트는 만약 A → B로 이동하는 경우가 새로운 경로라면, B → A로 이동하는 경로 또한 동일한 경로이기 때문에 체크를 해주어야 하는 것이다. 주어진 ..