전체 글 678

[JPA] 값타입 컬렉션 ( @ElementCollection, @CollectionTable )

[JPA] 임베디드 타입 ( @Embedded, @Embeddable ) @Id 어노테이션이 붙은 필드는 식별자를 의미한다. JPA는 식별자로 엔티티를 구분한다. @ManyToOne 등은 연관관계를 의미한다. JPA는 어노테이션으로 다른 엔티티와 연관관계를 정의한다. 이렇듯 개 lordofkangs.tistory.com 지난 포스팅에서 값타입의 개념과 임베디드타입을 다루어보았다. 테이블 컬럼에 삽입 될 데이터는 정합성을 가져야 한다. 컬럼과 매핑되는 엔티티는 정합성을 지킨 데이터를 가져야 한다. 원시타입은 JAVA에서 값복사를 지원하기에 정합성을 가지지만 참조타입은 참조복사를 하기에 다른 객체에서 데이터를 조작할 가능성이 있다. 그러므로 객체(컬렉션)는 참조복사가 아닌 값복사가 지원되어야 한다. 값타입이..

Dev/JPA 2023.06.12

[CodingTest] BOJ1697 숨바꼭질 ( BFS ) With 파이썬

1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net ◎ 문제풀이 N에서 K를 구하는 문제이다. 연산은 3가지이다. +1, -1, x2 연산 한번에 1초가 소요되고 몇초가 걸리는지를 구하는 문제이므로, 연산횟수를 구하는 문제이다. 시작점과 목표점이 주어지고 최소연산횟수를 구하는 문제이다. 1) DP가 아니라 BFS 문제 나는 DP가 먼저 연상되었다. 그러나 DP보다는 BFS가 더 적합한 알고리즘이다. 그 이유는 '시작위치'에 있다. DP는 더이상 쪼갤 수 없는 시작위치에서 목표지점까지 구..

문제풀이 2023.06.12

[CodingTest] BOJ10799 쇠막대기 ( 자료구조 ) With 파이썬

10799번: 쇠막대기 여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저 www.acmicpc.net ◎ 문제풀이 문제에 제시된 단어 하나하나를 모두 자료구조로 만들 필요는 없다. (완벽주의 조심!) 문제의 목적에 달성하기 위한 수단만 필요할 뿐이다. 즉, 레이저, 막대가 나왔다고 레이저, 막대를 자료구조로 만들 필요가 없다는 의미이다. 레이저가 막대기를 자르면 막대의 개수는 레이저 개수 + 1개 이다. "()"가 레이저이므로 레이저가 나올때까지 막대를 기억해야 한다고 생각해서 STACK을 떠올렸다. ")"는 두가지 경우가 있다. 1. 레이저인 경우 레이저가 등장하면 STA..

문제풀이 2023.06.12

[JPA] 임베디드 타입 ( @Embedded, @Embeddable )

@Id 어노테이션이 붙은 필드는 식별자를 의미한다. JPA는 식별자로 엔티티를 구분한다. @ManyToOne 등은 연관관계를 의미한다. JPA는 어노테이션으로 다른 엔티티와 연관관계를 정의한다. 이렇듯 개발자는 JPA가 엔티티를 목적에 맞게 사용하도록 여러 어노테이션으로 '표시'를 남긴다. ( 엔티티 매핑, 연관관계 매핑, 상속관계 매핑, 영속성 전이 등등 ) 이와같은 엔티티 관련 필드는 제외하고, 단순히 컬럼에 값을 저장하기 위한 필드를 '값타입'이라 부른다. Student 엔티티 @Entity @Data public class Student { @Id @GeneratedValue @Column(name = "STUDENT_ID") private Long id; private String name; /..

Dev/JPA 2023.06.09

[CodingTest] BOJ17413 단어뒤집기2 ( 문자열 ) with Python

17413번: 단어 뒤집기 2 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('')로만 이루어져 www.acmicpc.net ◎ 문제풀이 문자열을 조작하는 문제이다. 파이썬은 다양한 문자열 조작 함수를 제공하기에 간편하게 풀 수 있다. 문제의 목적은 태그(특수문자), 공백(특수문자)로 구분되는 문자열을 뒤집기이다. 문자열을 뒤집는 함수인 reverse()와 특수문자를 구분하는 isalnum()을 이용하면 문제에 쉽게 접근할 수 있다. 1) Pointer 하나를 만들고 문자열을 탐색한다. 2) 태그를 만나면 태그가 끝날때 까지 Pointer를 1씩 증가한다..

문제풀이 2023.06.09

[JPA] 영속성 전이와 고아객체

영속성 전이란, 부모가 자식의 영속성을 관리하는 기술이다. 영속성 전이는 주로 '합성관계'에서 사용되어야 한다. 합성관계는 부모가 자식을 제어하는 관계이다. 예를들어, MacBook은 일체형 노트북이다. MacBook노트북과 M1칩은 생명주기가 같다. 반면 조립형 컴퓨터는 다르다. 생산시기도 다른 부품들로 컴퓨터가 구성된다. 부모가 존재하기에 자식도 존재하는 관계가 합성관계이다. 이런 경우, 자식의 제어권은 부모에게 있기에 영속성도 부모의 제어권에 있도록 하는게 관리에 편하다. MacBook 엔티티 @Entity @Data public class MacBook { @Id @GeneratedValue private Long id; private String name; @OneToOne(cascade = C..

Dev/JPA 2023.06.08

[JPA] 지연로딩(Lazy Loading)을 사용해야 하는 이유

[JPA] 프록시( Proxy ) 위 사진은 영속성 컨텍스트가 동작하는 과정이다. 엔티티 객체를 생성하려면 SELECT문을 DB에 실행해야 한다. APP과 DB는 서로 다른 영역으로 I/O가 발생한다. 잦은 I/O는 성능저하의 원인이 되므로 lordofkangs.tistory.com 프록시를 다루면서 지연로딩(Lazy Loading)에 대해서 다루어 보았다. A엔티티와 B엔티티는 서로 연관되어 있다. JPA가 A엔티티를 로드하면 A가 참조하는 B엔티티도 로드되어야 한다. 하지만 DB와 잦은 소통은 성능을 저하시킨다. JPA(하이버네이트)는 성능 최적화를 위해, 연관된 엔티티는 가짜 객체(프록시,Proxy)로 만들어 실제 엔티티 객체 생성을 지연시키는 전략을 구사한다. 이를 지연 로딩(Lazy Loadin..

Dev/JPA 2023.06.08

[JPA] 프록시( Proxy )

위 사진은 영속성 컨텍스트가 동작하는 과정이다. 엔티티 객체를 생성하려면 SELECT문을 DB에 실행해야 한다. APP과 DB는 서로 다른 영역으로 I/O가 발생한다. 잦은 I/O는 성능저하의 원인이 되므로 성능 최적화를 위해 필요한 엔티티 객체만 생성해야 한다. Member 엔티티를 조회했다고 가정해보자. Member 엔티티는 Team엔티티와 연관관계에 있다. Member 엔티티 객체가 생성될 때 연관된 Team 엔티티도 만들어져야 한다. 그러나 연관된 모든 엔티티를 객체로 만들면 많은 I/O가 발생한다. 그래서 JPA(하이버네이트)는 성능 최적화를 위해, 연관된 객체는 가짜 객체(프록시,Proxy)로 만들고 실제 엔티티 객체 생성은 지연시키는 전략을 구사한다. 이를 지연 로딩(Lazy Loading)..

Dev/JPA 2023.06.08

[PS] BOJ11659 구간합구하기4 ( prefix-sum ) with Python,JAVA

◎ 문제 11659번: 구간 합 구하기 4 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j www.acmicpc.net ◎ 문제풀이 구간합을 구하는 문제이다. 시간제한이 1초이다. 대략 연산횟수 1억~10억이 1초가 걸린다. 반복문을 이용하면 시간복잡도는 O(N)이다. N은 최대 크기는 10만이다. 구간합을 M번 구해야 한다. 고로 N x M 연산해야 한다. 시간복잡도는 O(NM)이다. M도 10만이 최대이므로 최대 100억번의 연산을 수행해야 한다. 반복문을 활용하면 시간제한에 걸린다. 그러니 prefix-sum 알고리즘을 활용해보자. prefi..

문제풀이 2023.06.08

[PS] BOJ2609 최대공약수와 최소공배수 ( math ) with Python

@문제 2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. www.acmicpc.net @문제풀이 두 가지 풀이가 있다. 1) 유클리드 호제법 2) 파이썬 math 라이브러리 사용 유클리드 호제법 자연수 A를 B로 나눌때 나머지 r이라면 유클리드 호제법은 A와B의 최대공약수는 B와 r의 최대공약수와 동일함을 의미한다. 유클리드호제법 증명은 위 영상을 참고바란다. 그러면 B를 r로 나눌때 나머지 r2의 최대공약수도 A와B의 최대공약수와 동일하다. 그러면 r을 r2로 나눌때 나머지 r3의 최대공약수도 A와B의 최대공약수와 동일하다. . . . 그러면 rn-2를 rn-1로 나눌때 나머지 rn이 0이 되면 rn-1..

문제풀이 2023.06.08