전체 글 681

[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

[JPA] 공통속성 처리하기 - @MappedSuperclass

많은 엔티티가 공통으로 사용하는 속성이 있다. 수정일자, 등록일자, 수정자 같은 속성은 거의 모든 엔티티가 사용한다. 그러므로 공통으로 사용하는 속성을 중복으로 코딩하면 개발자가 효율이 떨어진다. JPA는 @MappendSuperclass 어노테이션을 지원하여 공통속성을 중복없이 처리한다. 엔티티는 공통속성을 가진 클래스를 상속한다. '상속'으로 구현했지만 '컬럼'이 필요할 뿐, 부모의 역할을 원하는 것이 아니다. 그러므로 BasicColumn은 엔티티가 아닌 추상클래스로 선언한다. 그리고 @MappedSuperclass 어노테이션으로 표시를 한다. JPA는 엔티티가 아닌 추상클래스이므로 테이블을 생성하지 않는다. @MappedSuperclass 어노테이션으로 표시되었음으로 클래스를 상속한 엔티티는 공통..

Dev/JPA 2023.06.07

[JPA] 상속관계 매핑 - JOIN전략, SINGLE_TABLE전략

객체지향과 관계형DB의 대표적인 패러다임 불일치가 '상속'이다. 객체지향은 '상속'이 있지만 관계형DB는 '상속' 개념이 없다. 그럼 관계형DB에서 상속을 어떻게 구현할 것인가? 1. JOIN 전략 2. SINGLE_TABLE 전략 JOIN 전략 JOIN전략은 '외래키'를 이용한 전략이다. 외래키를 이용하면 상속과 비슷한 형태로 구현할 수 있다. 학교구성원에는 학생(Student)과 교수(Professor)가 있다. 공통필드는 MEMBER 테이블에 외래키로 JOIN하여 가져온다. 개발자는 JPA에게 구현하고 싶은 전략을 어노테이션으로 알려주면, JPA는 자동으로 전략에 따라 테이블을 구현한다. MEMBER 엔티티 ( 부모 엔티티 ) @Entity @Inheritance(strategy = Inherita..

Dev/JPA 2023.06.07

[PS] BOJ1158 요세푸스 문제 ( 자료구조 ) with Python,JAVA

◎ 문제 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net ◎ 문제플이 큐 자료구조를 활용하면 쉽게 풀리는 문제이다. 1) 1부터 N까지 큐에 PUSH한다. 2) K번째 수를 찾으면 POP한다. 3) K번째 수가 아니면 POP하고 다시 PUSH한다. ◎ 코드 Python from collections import deque import sys input = sys.stdin.readline n,k = map(int,input().split()) q = deque([ x for x in range(1,n+1)]) result = [] count = 1 while q : if count == k : # K..

문제풀이 2023.06.07

[JPA] 연관관계 매핑 - 다대다 ( @ManyToMany )

학생은 여러 강의를 들을 수 있고 강의는 여러 수강생을 가진다. 이런 다대다 관계는 한 가지 문제가 있다. 관계형DB는 외래키로 테이블에 접근하는데, 외래키는 다대일 관계에서 '다'쪽이 갖는 것이 '규칙'이다. 그럼 다대다 관계에서는 누가 외래키를 가져야 할까? 둘 다 못 갖는다. 학생은 수많은 강의의 외래키를 관리할 수 없고 강의 또한 수많은 학생을 하나하나 외래키로 관리할 수 없다. 그래서 관계형 DB에서는 연결테이블을 만든다. 연결테이블이 '다' 포지션이 되고 학생과 강의가 '일' 포지션이 되면 '다대다'관계를 구현할 수 있다. 자료구조 강의 course_id가 1이라면 SELECT student_id FROM 연결 WHERE course_id = 1 이런 간단한 SQL문으로 자료구조강의를 듣는 학..

Dev/JPA 2023.06.07

[JPA] 연관관계 매핑 - 일대일 ( @OneToOne )

일대일관계는 주테이블이 외래키를 가지고 있느냐, 대상테이블이 외래키를 갖고 있느냐에 따라 성격이 달라진다. 회원과 라커는 일대일 관계이다. 회원이 있어도 라커는 없어도 된다. 반대로 회원이 없는데 라커가 있으면 안 된다. 이처럼 주도권을 가지고 있는 객체의 테이블을 주테이블이라고 한다. 주테이블이 외래키(FK)를 가지고 있으면 객체지향과 패러다임이 일치한다. 회원테이블이 외래키를 가지므로 회원테이블에서 라커테이블에 접근한다. 그러나 한 가지 문제가 있다. 회원만 있고 라커가 없다고 가정해보자. 라커가 없으면 FK는 NULL값이 된다. FK에 NULL값이 들어갈 수는 있지만 DB관점에서 좋지 못하다. 그럼 반대로 대상테이블에 외래키(FK)가 있는 경우를 생각해보자. 회원과 라커는 양방향 관계가 된다. 라커..

Dev/JPA 2023.06.06

[PS] BOJ1046 에디터 ( 자료구조 ) with Python,JAVA

◎ 문제 1406번: 에디터 첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수 www.acmicpc.net ◎ 문제풀이 자료구조의 힘을 알 수 있는 문제이다. 적절한 자료구조는 시간복잡도를 현격히 줄일 수 있다. 내가 처음 구현했던 코드는 시간초과가 발생했다. 처음 구현한 코드 import sys input = sys.stdin.readline data = list(input().strip("\n")) cursor = len(data) n = int(input()) def editor(data,op) : global cursor if op[0] == "P" :..

문제풀이 2023.06.06

[JPA] 연관관계 매핑 - 일대다 ( @OneToMany )

[JPA] 연관관계 매핑 - 다대일 ( @ManyToOne ) JPA는 객체지향설계와 관계형DB의 패러다임 불일치를 해결하는 프레임워크이다. 객체지향설계의 가장 대표적인 특성이 '연관관계'이다. 객체는 주소를 참조하여 다른 객체에 접근할 수 있다. A객 lordofkangs.tistory.com 지난 포스팅에서 다대일 관계를 알아보았다. 다대일관계는 관계형DB와 패러다임이 일치하여 객체지향설계에서 가장 많이 사용하는 연관관계이다. 이에 반해, 일대다매핑은 거의 사용되지 않는다. 일대다 관계는 '일'이 '다'쪽을 참조하는 관계이다. 그러나 DB테이블은 '다'가 외래키를 갖고 있어, '다'가 '일'에 접근해야 한다. 이렇듯, 패러다임이 불일치하여 혼란을 줄 여지가 있어 일대다 매핑은 거의 사용되지 않는다. ..

Dev/JPA 2023.06.05