본문 바로가기

분류 전체보기

JPA 값타입 JPA의 데이터타입 JPA에는 두가지 데이터타입이 있다. 하나는 지금까지 배운 엔티티이고 나머지 하나는 값타입이다. 엔티티 타입 @Entity로 정의하는 객체 데이터가 변하면 식별자를 가지고 변경감지가 가능 값타입 int, String 처럼 단순히 값으로 다루는 타입 데이터가 변하면 감지 불가능 값타입에도 종류가 있다! 기본값 타입 - int, double, Integer, Long, String 등등 임베디드 타입 컬렉션 값 타입 먼저 기본값 타입은 엔티티를 삭제할 경우에 같이 삭제되는 데이터들이다. 생명주기를 엔티티에 의존한다고 표현한다. 값타입은 당연히 공유가 되지 않는다. 이제 임베디드타입과 컬렉션 값 타입이라는 것에 대해서 알아보자 임베디드 타입 임베디드 타입이 무엇이고 왜 쓰이는지 예제를 통해.. 더보기
릿코드62 - Unique paths [dp] class Solution: def uniquePaths(self, m: int, n: int) -> int: arr = [[0 for _ in range(n)] for _ in range(m)] for i in range(n) : arr[0][i] = 1 for i in range(m): arr[i][0] = 1 for i in range(1, m) : for j in range(1, n) : arr[i][j] = arr[i-1][j] + arr[i][j-1] return arr[m-1][n-1] 릿코드..... 실행할 때마다 시간이 미묘하게 변하는거 같다.. 지금까지 시간 줄이려고 로직 수정하고 했던건 다 우연히 줄었었나보다.. ㅋㅋㅋㅋㅋㅋ 더보기
릿코드155 - min Stack [스택] class MinStack: def __init__(self): self.stack = [] self.minStack = [] self.min = 2**31 def push(self, val: int) -> None: self.stack.append(val) self.min = self.min if val > self.min else val self.minStack.append(self.min) def pop(self) -> None: num = self.minStack.pop() self.stack.pop() if not self.minStack : self.min = 2**31 if num == self.min : self.min = min(self.minStack) def top(self) -> i.. 더보기
함수형 프로그래밍2 - 명령형에서 선언형으로 이터러블 프로그래밍 홀수 n개 더하기를 명령형으로 구현해보면 아래와 같이 효율적으로 가능하다. function f1(limit, list) { let acc = 0; for(const a of list) { if(a % 2) { const b = a * a; acc+=b; limit--; if(limit == 0) break; } } return acc; } let a= f1(3, [1,2,3,4,5,6,7,8,9,10]); console.log(a); 위의 코드를 한번 생각해보면 이터러블한 객체를 순회하며 특정 조건에 부합할 때(filter) 값을 조작하여(map) 결과를 만들어내는데(reduce) 특정 조건에서 break문을 통해 빠져나오고 있다.(take) 이를 적용해서 코드를 아래와 같이 바꿀 수.. 더보기
JPA 프록시와 영속성 전이 프록시에 대해 em.find()와 em.getReference() 의 차이는 프록시를 사용하고 안하고이다. find를 호출하면 select가 데이터베이스에 바로 날아가서 가져오는거고 getReference는 영속성 컨텍스트가 해당 객체에 대한 참조값만 들고있게 된다. 해당 객체에 접근하기 전까지는 select문이 나가지 않는다. getId()를 하면 select문이 나가지 않는데 이유는 처음에 em.getReference()에서 인자로 id를 줬기때문에 영속성 컨텍스트가 알고있는 값이라 select문을 실행하지 않는다. getUsername() 할때에서야 비로소 select문이 나간다. 프록시의 특징을 정리하면 다음과 같다. 프록시 객체는 처음 한번만 초기화 된다. 객체에 접근해서 select문이 나갈때.. 더보기
릿코드 2 - 두 수 더하기 (리스트) class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head = new ListNode(); ListNode cursor = head; int up = 0; int num1, num2; while(l1 != null || l2 != null) { if(l1 == null) num1 = 0; else { num1 = l1.val; l1 = l1.next; } if(l2 == null) num2 = 0; else { num2 = l2.val; l2 = l2.next; } int tmp = num1 + num2 + up; up = tmp / 10; cursor.val = tmp % 10; if(l1 == null.. 더보기
JPA 엔티티 매핑2 일대다 단방향 매핑 이전 정리글에서는 단방향 매핑은 보통 연관관계의 주인이 n쪽이므로 다대일 단방향 매핑에 대해서만 정리했다. 하지만 일대다 단방향도 가능하다고 한다. 우선 일대다에서는 객체의 데이터가 변경되면 디비에서 해당 엔티티의 테이블이 아닌 상대방 쪽의 테이블에 데이터가 수정된다. 무슨말인지 예시를 통해 보면. 만약 Team의 members에 새로운 멤버를 하나 추가한다고 하면 디비에서는 Team 테이블이 아닌 Member 테이블에 값이 추가되거나 변경된다는 말이다. @Entity @Getter @Setter public class Book { @Id @GeneratedValue private Long id; private String name; } @Entity @Getter @Setter pu.. 더보기
릿코드 20 - 괄호 짝 맞추기 class Solution(object): def isValid(self, s): bracket = { '(' : 1, ')' : -1, '{' : 2, '}' : -2, '[' : 3, ']' : -3} mystack = [] for i in s : if bracket[i] > 0 : mystack.append(bracket[i]) else : if not mystack : return False if int(mystack[-1]) + bracket[i] == 0 : mystack.pop() else : return False return len(mystack) == 0 class Solution(object): def isValid(self, s): openBracket = { '[' : ']', '.. 더보기
릿코드 104 - 트리의 가장 깊은 층 # 재귀 버전 class Solution(object): def pre(self, node, count, depth): count += 1 if node.right: self.pre(node.right, count, depth) if node.left: self.pre(node.left, count, depth) if count > depth[0]: depth[0] = count def maxDepth(self, root): depth = [0] if root: self.pre(root, 0, depth) return depth[0] # iter 버전 class Solution(object): def maxDepth(self, root): stack = [(1, root)] maxDepth = 0 whi.. 더보기
백준 1068 - 트리 문제 node = int(input()) parent = [int(x) for x in input().split(' ')] deleted = int(input()) class Node : def __init__(self, data): self.data = data self.child = [] class Tree : def __init__(self, node): self.root = node self.leaf = 0 def preorder(self, node): for i in node.child : if i.data == deleted: continue self.preorder(i) if not node.child or (len(node.child) == 1 and node.child[0].data == de.. 더보기