전체 글

JPQL 기본
소개 EntityManager.find → 이후 필요시 객체 그래프 탐색 검색을 하는 경우 엔티티 객체를 대상으로 쿼리를 작성해야한다. 모든 DB 데이터를 객체로 변환하는 것은 좋지 않기 때문에 필요한 데이터만 불러오기 위해 검색 조건이 포함된 SQL을 사용한다. JPQL은 객체 지향 쿼리 언어이고 엔티티 객체를 대상으로 쿼리를 날린다. (SQL은 DB 대상 쿼리) SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. List members = em.createQuery( "select m from Member m where m.username like '%kim%'", Member.class ).getResultList(); Criteria JPQL은 동적 쿼리를 만드는 것이 어렵다. 또한 ..
![[백준, Java] 14226번 : 이모티콘](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FccTOAC%2FbtrIn37iegK%2FAAAAAAAAAAAAAAAAAAAAAEW8SnuTCE2dUtNaKi_fXwiOzQbVsPPKPvprYyjcDzDB%2Fimg.gif%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3Dzk2uHQmUJZ08vspTHDU5a8FLi4Q%253D)
[백준, Java] 14226번 : 이모티콘
🔗 문제 링크 https://www.acmicpc.net/problem/14226 😮 문제 해결 방법 BFS를 이용한 완전 탐색 방식으로 문제를 해결했다. 최초의 경우에는 화면에만 이모티콘이 있으므로 큐에 넣고 시작한다. 현재 시간에만 할 수 있는 행동을 구분하기 위해서 큐의 사이즈만큼만 현재 초에는 반복을 돌게 한다. 각각의 행동은 아래와 같은 조건에 따라서 할지 말지 구분할 수 있다. 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다. 보내려는 이모티콘 개수보다 화면에 있는 이모티콘의 개수가 더 적은 경우에 이모티콘을 복사하는 것이 의미있다. 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다. 보내려는 이모티콘 개수보다 화면에 있는 이모티콘의 개수가 더 적은 경우에 이모티콘을 클립보드로 가..
![[백준, Java] 21610번 : 마법사 상어와 비바라기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FIqboa%2FbtrIioSjeNW%2FAAAAAAAAAAAAAAAAAAAAADcMvDcPV5gxrevrx86uaTqLbXHLqTGUOg_WVYiGbloq%2Fimg.gif%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3DqWajiRhF8CZqKLQOzo4TDv5A%252Fsg%253D)
[백준, Java] 21610번 : 마법사 상어와 비바라기
🔗 문제 링크 https://www.acmicpc.net/problem/21610 😮 문제 해결 방법 주어진 기능 순서대로 구현하면 되는 시뮬레이션 문제이다. 구름이 di 방향으로 si칸 이동한다. 이 부분에서는 배열의 범위가 넘어가는 경우 처음 아니면 마지막으로 온다. 다음 행과 열을 구한다. (현재 행 , 열 + DX[방향] * 거리) 다음 행과 열이 0보다 작거나 N보다 크거나 같은 경우 넘어간 범위를 구해야한다. 0 보다 작은 경우 : (다음 행 or 열 + 1) % N + N - 1; N보다 크거나 같은 경우 : 다음 행 or 열 % N 넘어간 인덱스까지 구해진 경우 이동 후 구름 배열에 표시하고 해당 바구니의 물을 1 증가시킨다. 방금 물을 뿌린 부분에 물복사 버그를 진행한다. 이동 후 구름 ..

API 속도가 이상하다..? CPU는 왜 점유율 99%..?
Kafka? RabbitMQ? 어떤 것을 쓸까? 프로젝트를 시작할 때 MSA 아키텍쳐로 프로젝트를 진행해보자고 의사결정이 되었다. MSA 아키텍쳐는 서비스 간 의존성을 낮춘 만큼 서비스 간 이벤트 기반 메세지 전송 방식이 존재할 수밖에 없었다. 기술 스택을 확립해 가는 과정에서 우리는 RabbitMQ와 Kafka 중 하나를 선택해서 개발을 진행하자고 결정이 되었고 장, 단점을 하나씩 정리해보았다. RabbitMQ 프로듀서와 컨슈머 간 메세지 전달을 보장. 안정성 있는 전달을 토대로 관리적인 측면이나 다른 기능을 구현하는 것이 가능하다. 상대적으로 가볍다. 컨슈머에게로 메세지 전달이 되는 순간 (메세지 큐에서 메세지가 빠지는 순간) 삭제된다. 컨슈머가 성공적으로 메세지를 전달받았지만 예기치 못한 문제로 인..

값 타입
엔티티 타입 @Entity 데이터가 변해도 식별자를 이용해 추적하는 것이 가능하다. 즉 컬럼의 데이터가 변경되더라도 @Id로 데이터를 추적하는 것이 가능하다. 값 타입 int, Integer, String 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경되더라도 추적이 불가능하다. 값 타입 분류 기본값 타입 : 자바 기본 타입 (프리미티브 타입), 래퍼 클래스, String 임베디드 타입 (Embeddet Type, 복합 값 타입) : 커스텀 클래스 같은 형태 ex) Position (x, y), Address (city, street, zipcode) 컬렉션 값 타입 : 기본 값타입 , 임베디드 타입을 컬렉션에 넣은 형태 기본값 타입 생명주기를 엔티티에 의존한다..
![[백준, Java] 1039번 : 교환](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbcCLGX%2FbtrHYYeyCVy%2FAAAAAAAAAAAAAAAAAAAAAAUf8snSQpp_nz1gU7IN4C1eCqh0zdFC3NrBpZv2DTVp%2Fimg.gif%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3DbEUxos9Mwge3BPgeJiuPbt7hP1Y%253D)
[백준, Java] 1039번 : 교환
🔗 문제 링크 https://www.acmicpc.net/problem/1039 😮 문제 해결 방법 주어진 숫자 M에 대해서 자릿수 교환이 K번 일어났을 때 나올 수 있는 최대값을 구하는 문제이다. 자릿수 i보다 자릿수 j가 더 커야하는 제한 조건이 있기 때문에 교환할 수 있는 자릿수의 순서쌍을 모두 구한다. 모두 구한 순서쌍과 함께 초기에 주어진 M 값과 K = 0인 상태로 큐에 넣어준다. 매 턴 마다 존재할 수 있는 값을 순서쌍을 이용해 구한다. 큐의 사이즈만큼 반복한다. 순서쌍을 이용해 자릿수 교환이 이뤄졌을 때 값을 체크한다. 이미 현재 턴에 교환한 숫자가 나왔거나 0으로 시작하는 경우의 값은 큐에 넣지 않는다. 만약 턴을 모두 사용한 경우에는 Set에다가 넣어주고 큐에는 넣지 않는다. 이외의 경..

영속성 전이 (Cascade), 고아 객체
영속성 전이(Cascade) 특정 엔티티를 영속 상태로 만들 때 연관 관계에 있는 엔티티도 함께 영속 상태로 만들고 싶은 경우 사용한다. @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); ... } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name ="parent_id..

즉시 로딩과 지연 로딩
지연 로딩을 통해 연관관계 데이터를 실제 조회 시점에 가져오는 것이 가능하다. fetch = FetchType.LAZY @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩으로 세팅 @JoinColumn(name = "TEAM_ID") private Team team; 연관 관계 엔티티를 지연 로딩으로 세팅하면 프록시로 가져온다. 지연 로딩으로 가져온 엔티티는 실제 값을 사용하는 시점에 프록시를 초기화한다. Member member1 = new Member(); member1.setUsername("zayson1"); member1.setTeam(team); // Team의 데이터는 프록시로 가져온다. (Team 조회 쿼리 안날아감) Member member = em.find(M..