본문 바로가기

전체 글

(131)
[JPA] flush란 flush()란? 영속성 컨텍스트의 변경 내용을 디비에 반영하는 것이다. (즉, 영속 컨텍스트 안에 있는 쓰기 지연 SQL 저장소의 쿼리들을 디비에 보내는 것이다.) 보통 트랜젝션이 커밋할 때, flush가 일어난다. flush가 발생하면 무슨 일이 일어나는가? 변경 감지(더티 체킹) - 1차 캐시의 스냅샷과 현재 Entity 체킹하는 것. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 디비에 전송 (어찌 보면 위 3가지는 Entity를 조회한 후, 수정하고 커밋하는 과정을 단계별로 나열한 것과 같다.) 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 호출 트랜잭션 커밋 - 플러시 자동 호출 JPQL 쿼리 실행 - 플러시 자동 호출 em.flush()직접 ..
[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..