GitHub

https://github.com/Choidongjun0830

전체 글 444

[프로그래머스] Lv3. N으로 표현 DP 🙁

N으로 표현문제 설명아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.12 = 5 + 5 + (5 / 5) + (5 / 5)12 = 55 / 5 + 5 / 512 = (55 + 5) / 55를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.제한사항N은 1 이상 9 이하입니다.number는 1 이상 32,000 이하입니다.수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.최솟값이 8보다 크면 -1을 return 합니다.입출력 예Nnumberreturn51242113  5를 ..

[JPA 활용 2편] API 개발 고급 - 실무 필수 최적화

OSIV와 성능 최적화Open Session In ViewJPA의 영속성 컨텍스트와 데이터베이스 커넥션은 밀접한 관련이 있다.서비스 계층에서 데이터베이스 트랜잭션 시작 시에 JPA의 영속성 컨텍스트가 데이터베이스 커넥션을 가져온다. Open Session In View는 트랜잭션이 끝나도 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것이다. 끝까지 살아있다가 응답이 나가면 그때 데이터베이스 커넥션을 돌려주고 영속성 컨텍스트가 사라진다. 그래서 지연 로딩이 가능했던 것이다. 하지만 이 전략은 데이터베이스 커넥션 리소스를 계속 사용해서 커넥션이 모자라 장애로 이어질 수 있다. OSIV를 Off서비스 계층에서 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.커넥션 리소스를 낭비..

Spring 2024.07.08

[JPA 활용 2편] API 개발 고급 - 컬렉션 조회 최적화

컬렉션인 일대다 관계 (OneToMany)를 조회하고 최적화하기. 일인 쪽이 하나고, 다 쪽이 3개면 전체 row가 3줄로 뻥튀기가 된다. 이 경우에는 최적화하기 어렵다.  주문 조회 V1: 엔티티 직접 노출엔티티를 직접 노출하기 때문에 사용하면 안된다. 주문 조회 V2: 엔티티를 DTO로 변환DTO안에 엔티티가 있으면 안된다. 이 경우에도 다 노출이 되어버린다. 엔티티에 대한 의존을 완전히 끊어야 한다. 속에 있는 엔티티도 DTO를 만들어서 바꿔주어야 한다. 하지만 N+1 문제 발생주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화데이터가 뻥튀기 된다고 하셨는데 Hibernate6부터는 distinct가 되어서 뻥튀기 되지 않음.hibernate5를 사용하면 em.createQuery()를 ..

Spring 2024.07.05

[JPA 활용 2편] API 개발 고급 - 지연 로딩과 조회 성능 최적화

주문 + 배송 정보 + 회원을 조회하는 API를 만들기 간단한 주문 조회 V1: 엔티티를 직접 노출 -> 무한 루프에 빠지게 됨. 주문에서 멤버로, 멤버에서 주문이 있네? 주문으로양방향이 걸리는 필드를 @JsonIgnore 해주어야 함.하지만 이러면 500 오류가 남.또는 Hibernate5Module을 등록해서 사용해야함.하지만 엔티티를 직접 노출하면 데이터 그대로 노출하는 것이라 좋지 않다. 이 방식을 사용하면 안된다.DTO로 변환해서 사용하는 것이 좋다.지연 로딩을 피하기 위해 즉시 로딩으로 바꾸면 안됨. 연관 관계가 필요없는 경우에도 데이터를 항상 조회해서 성능 문제가 발생한다. 간단한 주문 조회 V2: 엔티티를 DTO로 변환 이 방식이면 엔티티가 바뀌어도 api 스펙이 바뀌지 않아서 좋다. 하지..

Spring 2024.07.03

[JPA 활용1 복습] 도메인 분석 설계

멤버와 오더가 있을 때. 회원이 주문을 하는 것이지만, 멤버와 오더를 동급으로 두고 고민해야 한다.실무에서는 회원이 주문을 참조하지 않고, 주문이 회원을 참조하는 것으로 충분하다.  Getter는 모두 열어두는 것이 편하다.Setter는 모두 열어두면 엔티티가 왜 변경되는지 추적하기 힘들어지기 때문에 Setter를 제공하는 것 대신에, 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공해야 한다.  @Embeddable@Getterpublic class Address { private String city; private String street; private String zipCode; protected Address() {} public Address(Str..

Spring 2024.06.27

[JPA 기본편] 객체지향 쿼리 언어2 - 중급 문법

경로 표현식.(점)을 찍어 객체 그래프를 탐색하는 것select m.username -> 상태 필드from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A';m.team은 엔티티로 넘어가는 것. 이것을 단일 값 연관 필드라 함.m.orders. orders는 보통 컬렉션. 컬렉션으로 가는 것을 컬렉션 값 연관 필드라 함. 상태 필드(state field): 단순히 값을 저장하기 위한 필드연관 필드(association field):연관 관계를 위한 필드단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 ..

Spring 2024.06.26

[JPA 기본편] 객체지향 쿼리 언어1 - 기본 문법

JPQL은 엔티티 객체를 대상으로 쿼리. SQL은 데이터베이스 테이블을 대상으로 쿼리.JPQL을 한마디로 정의하면 객체 지향 SQL 하지만, JPQL로 동적 쿼리를 작성하기 불편하다.. Criteria //Criteria CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(Member.class); Root m = query.from(Member.class); String username = "aaaa"; CriteriaQuery cq = quer..

Spring 2024.06.25
728x90