본문 바로가기

개발

(99)
[JPA] 연관관계 매핑 연관관계 매핑이란? JPA를 통해 객체의 참조와 테이블의 외래 키를 매핑 용어 이해 방향: 단방향, 양방향 다중성: 다대일, 일대다, 일대일, 다대다 연관관계의 주인: 객체 양방향 연관관계는 주인이 필요(이게 제일 어려움) 간단한 예시와 함께 알아 보겠다. 위와 같은 시나리오에서, 테이블 간에 관계를 먼저 생각해야 한다. 팀과 회원 간에 관계를 생각했을 때, 팀(1):회원(N)으로 이루어질 것이다. 이것을 객체가 테이블에 맞추어 모델링 한다면 이러한 구조로 만들어 질 것이다. 이러한 테이블이 있다는 가정하에, insert를 한다면 Team을 만들고, 멤버를 만든다. 그리고 이 멤버에는 Team의 Id값을 저장하여 insert한다. + 근데 궁금한 점이,, 만약 저렇게 create하면, 디비에도 테이블이 ..
[JPA] 영속성 컨텍스트 앞에서 JPA란 무엇인지, JPA안에서 영속성 컨텍스트가 어떤 역할을 하는지 등을 살펴보았다. 그럼 영속성 컨텍스트와 관련해서 엔티티의 생명주기를 살펴보겠다. 엔티티의 생명주기 영속성 컨텍스트는 기본적으로 위와 같은 생명주기를 가지게 된다. 각각을 살펴보면, 비영속 상태 비영속 상태는 말 그대로 영속성 컨텍스트와 전혀 관계가 없는 엔티티의 상태를 말한다. 가령 Entity를 생성을 한 상태에서 persist와 같이 영속화 시켜주지 않았다면, 비영속 상태이다. 영속 상태 영속 상태는 생성된 Entity를 persist와 같이 영속화 시켜준 상태를 말하고, 해당 상태에서는 영속성 컨텍스트가 해당 Entity를 관리한다. 준영속 상태 영속성 컨텍스트에 저장되었다가 분리된 상태를 말한다. em.ditached와..
JPA란 JPA(Java Persistence API)는 자바의 ORM 기술 표준이다. ORM(Object-Relational Mapping) 객체와 관계형 DB를 매핑하는 것이다. 즉, 개발자가 직접 SQL을 작성하지 않고, 객체를 자동으로 Mapping하여 DB에 전달한다. JPA의 구동 방식 그림과 같이 JPA는 Persistence로 EntityManagerFactory를 생성한 후, 요청에 따라 EntityManager를 생성하여 Transaction 단위를 처리한다. + JPA는 트랜잭션 단위 안에서 작업을 해줘야 한다. (이 부분이 왜 그런지 알아보자) 이러한 과정을 코드로 간단히 구현한 부분이다. persistence를 통해 EntityManagerFactory를 생성하고, EntityManager..
[Spring] MockMvc MockMvc란 실제 객체와 비슷하지만, 테스트에 필요한 기능만 가지는 가짜 객체를 만들고, 서버에 배포하지 않고 재현할 수 있는 클래스를 의미한다. -> 예를 들어, 구현한 코드를 테스트 해보기 위해서는 서버를 띄우고 Postman과 같은 툴로 확인을 했었지만, MockMvc로 인해, 이러한 과정 없이 바로 테스트를 해볼 수 있다. MockMvc를 검색하면, 대부분의 블로그에서 사용법을 위주로 설명하신다. 이미 이러한 사용법에 대해서는 많이 나와있으니, 내가 궁금했던 것들을 기록하자. TestCode를 생성할 때, JUnit4인지 JUnit5인지 선택하게 된다. 이 둘의 차이는 무엇일까? JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit P..
[우아한테크세미나] 190620 우아한객체지향 by 조영호님 출처: https://www.youtube.com/watch?v=dJ5C4qRqAgA&t=1764s 이 글은 객체지향 언어를 설계할 때 핵심인 의존 관계의 종류와 그에 대한 개념 그리고 그것을 어떻게 설계할 수 있는지에 대한 영상을 보고, 그 내용을 정리한 포스팅이다. 객체지향 언어를 사용하면서 설계는 필수적이고, 설계를 할 때는 의존성을 어떻게 관리하는지가 핵심이다. 의존성에 따라 설계가 바뀌게 되고, 이것에 의거하여 코드를 어떻게 배치할 것인가에 대한 의사 결정이 설계라고 보면 도니다. 그럼 의존성의 정의는 무엇일까? 간단하게 말하면, A가 B에 의존한다고 할 때, B가 변경이 있으면 A도 변경이 있다는 의미이다. 하지만 주의할 점은 B가 변경이 있다고 해서 무조건 A도 변경이 있어야 의존성이 있는 ..
[프로그래머스] Level2_메뉴 리뉴얼 틀린 풀이 result_level = [] result = [] max_num = 0 def dfs(cnt, check, idx, count, orders): if cnt == count: calcul(check, orders) return for i in range(idx, len(check)): if not check[i]: check[i] = True dfs(cnt + 1, check, i, count, orders) check[i] = False def calcul(check, orders): global max_num test_str = "" count = 0 for i in range(len(check)): if check[i]: test_str += chr(65 + i) for o in or..
[프로그래머스] Level2_오픈채팅방 정답 코드 def solution(record): dic = {} result = [] for com in record: if com.split(" ")[0] == "Enter" or com.split(" ")[0] == "Change": dic[com.split(" ")[1]] = com.split(" ")[2] for com in record: if com.split(" ")[0] == "Enter": result.append("{}님이 들어왔습니다.".format(dic[com.split(" ")[1]])) elif com.split(" ")[0] == "Leave": result.append("{}님이 나갔습니다.".format(dic[com.split(" ")[1]])) return result..
[프로그래머스] Level2_타겟 넘버 정답 코드 score = 0 number = [] target = 0 def dfs(sum, idx): global number, score, target if idx == len(number): if sum == target: score += 1 return 0 dfs(sum+number[idx], idx+1) dfs(sum-number[idx], idx+1) def solution(numbers, tar): global target, number number = numbers target = tar dfs(0, 0) return score 틀린 코드 result = [] def dfs(check, idx, cnt, nums, target): if cnt == len(nums): calcul(check..