일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- shared lock
- 비관적락
- 일대다
- exclusive lock
- FetchType
- 다대일
- 스프링 폼
- JPQL
- 동적sql
- fetch
- CHECK OPTION
- 연관관계
- 스토어드 프로시저
- 지연로딩
- 유니크제약조건
- querydsl
- 다대다
- 백트래킹
- 이진탐색
- BOJ
- 연결리스트
- eager
- execute
- 낙관적락
- 데코레이터
- 즉시로딩
- 힙
- SQL프로그래밍
- dfs
- PS
- Today
- Total
목록전체 글 (557)
흰 스타렉스에서 내가 내리지
@Entity @Getterpublic class Member{ @Id private String id; private String name; @Override public boolean equals(Object obj){ if (this == obj) return true; if (!(obj instanceof Member)) return false; //-- 1 Member member = (Member) obj; if (name != null ? !name.equals(member.getName()) : member.getName() != null) ..
Member refMember = em.getReference(Member.class, "member1");Member findMember = em.find(Member.class, "member1");assertTrue(refMember == findMember); // 성공 먼저 em.getReference() 메소드를 사용해서 프록시로 조회했다.그리고 다음 em.find() 를 사용해서 조회했다. refMember 는 프록시고, findMember 는 원본 엔티티이므로 둘은 서로 다른 인스턴스인가? # 프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다.영속성 컨텍스트는 프록시로 조회된 엔티티에 대해서 같은 엔티티를 찾는 요청이 오면 원본 엔티티가 아닌 처음 조회된 프록시를 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/WCrLR/btsG1zFWxqj/CZwK75jUOCFDnsfDJwOkA1/img.png)
# 엔티티 비교같은 영속성 컨텍스트에서 엔티티를 조회하면 다음 코드와 같이 항상 같은 엔티티 인스턴스를 반환한다.Member member1 = em.find(Member.class, "1L");Member member2 = em.find(Member.class, "2L");assertTrue(member1 == member2); # 영속성 컨텍스트가 같을 때 엔티티 비교@Transactionalpublic class MemberServiceTest{ ... @Test public void join(){ //Given Member member = new Member("member1"); //When Long saveI..
벌크성 수정 쿼리 👇🏻👇🏻👇🏻👇🏻👇🏻update Member m set m.age = m.age - 1 스프링 데이터 JPA 에서 벌크성 수정, 삭제 쿼리는 org.springframework.data.jpa.repository.Modifying 어노테이션을 사용한다. 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트를 초기화하고 싶으면 @Modifying(clearAutomatically = true) 로 설정하면 된다. 이 옵션의 기본값은 false 이다. @Modifying@Query("update Member m set m.age = m.age - 1")int addAge();@Modifying(cleatAutomatically = true)@Query("update Member m..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dgBC1l/btsGUXhRyn5/2P4pViSL52K2MpdDKcHrk1/img.png)
이메일과 이름으로 회원을 조회하려면 다음과 같은 메소드를 정의하면 된다.List findByEmailAndName (String email, String name); 메소드를 실행하면 스프링 데이터 JPA 는 메소드 이름을 분석해서 JPQL 을 생성하고 실행한다.실행된 JPQL : select m from Member m where m.email = ?1 and m.name = ?2 # JPA Query Method 표 https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html JPA Query Methods :: Spring Data JPABy default, Spring Data JPA uses position-based par..
예를 들어, 북마크 여부를 boolean 타입으로 사용하고 싶다고 하자. JPA 를 사용하면 DB에 저장될 때 0 또는 1인 숫자로 저장된다. 그런데 DB 에 숫자 대신 문자 Y 또는 N 으로 저장하고 싶다면 컨버터를 사용하면 된다. @Entitypublic class Member { ... @Convert(converter=BooleanToYNConverter.class) private boolean bookmarked; ...} - Boolean 을 YN 으로 변환해주는 컨버터@Converterpublic class BooleanYNConverter implements AttributeConverter{ @Override public String co..
즉시 로딩은 JPQL 을 실행할 때 N+1 문제가 발생할 수 있다.그럼, 지연 로딩일 때는 N+1 문제가 발생하지 않는가? @Entitypublic class Order{ ... @ManyToOne(fetch = FetchType.EAGER) private Member member; ...} 주문 엔티티를 조회하면 연관된 member 엔티티도 항상 함께 로딩된다. # 글로벌 페치 전략에 즉시 로딩 사용 시 단점사용하지 않는 엔티티를 로딩한다.N+1 문제가 발생한다. # N+1 문제em.find() 메소드로 엔티티를 조회할 때 연관된 엔티티를 로딩하는 전략이 즉시 로딩이면, 데이터베이스에 JOIN 쿼리를 사용해서 한 번에 연관된 엔티티까지 조회한다. Order or..
스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.이 말은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다. 트랜잭션을 시작할 떄 영속성 컨텍스트를 생성하고, 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다.같은 트랜잭션 내에서는 항상 같은 영속성 컨텍스트에 접근한다. 즉, 1트랜잭션 1PC -- -- 보통 서비스 계층에 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다.이 어노테이션이 있으면 호출한 메서드를 실행하기 직전에 스프링의 트랜잭션 AOP 가 먼저 동작한다. # 흐름도 트랜잭션 시작⬇️메서드 호출⬇️메서드 정상 종료⬇️Persistence Context flush⬇️DB 트랜잭션 커밋-- 만약 메서드에서 예외가 발생하면 트랜잭션을 롤백..
# 영속성 컨텍스트에 이미 엔티티 데이터가 있는데, 이를 다시 JPQL 로 조회하면?em.find(Member.class, "hong");em.createQuery("select m from Mmebr m", Member.class).getResultList(); JPQL 로 데이터베이스에서 조회한 엔티티가 영속성 컨텍스트에 이미 있으면, JPQL 로 데이터베이스에서 조회한 결과를 버리고 대신에 영속성 컨텍스트에 있던 엔티티를 반환한다.이 때, 식별자 값을 사용해서 비교한다. JPQL 은 항상 데이터베이스에 SQL 을 실행해서 결과를 조회한다. JPQL 을 사용해서 조회를 요청한다JPQL 은 SQL 로 변환되어 데이터베이스를 조회한다.조회한 결과와 영속성 컨텍스트를 비교한다식별자 값을 기준으로 memb..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bq4IaJ/btsGSlwop8T/tgtcU8Mjyb9RvyrcnCOlYK/img.png)
https://school.programmers.co.kr/learn/courses/30/lessons/62050 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 2차원 배열 각각의 칸은 그래프의 각 노드로 보고, 옆 칸으로 이동하는 것을 간선으로 본다그리고 비용 없이 이동할 수 있으니까 간선의 비용을 0 으로 생각하면 된다.이걸 왜 생각 못했냐 그리고 그래프를 따로 만들 필요도 없이, 인접한 좌표들에 대해 바로 heapq 에 넣어주면 된다. 그래서 어차피 cost 가 0 이면 answer 에는 변함이 없으니, 계속해서 ..