본문 바로가기

분류 전체보기

(38)
스프링부트 redis 동시성 관리 [리뷰+리뷰댓글] 리뷰와 리뷰댓글 엔티티가 있다.1번 리뷰의 리뷰댓글을 작성하면 1번 리뷰의 리뷰댓글 컬럼이 +1로 업데이트 되는 단순한 작업을 하려고 한다.문제는 동시에 다수가 1번 리뷰에 대한 댓글을 작성할때 문제가 일어난다.100명이 동시에 1번 리뷰에 댓글을 달면 리뷰의 리뷰댓글 필드는 100이 되어야 하는데 ,동시성 이슈가 발생해 기대값인 100이 아닌 12로 업데이트 된 것을 확인할 수 있었다. 이에 프로젝트에 레디스를 이미 사용중이기에 레디스를 이용한 동시성 제어를 했다.방식은 Lettuce로 스프링부트에 Redis를 사용하기 위해 아래 의존성을 추가하면 기본적으로 제공되는 클라이언트 이다.implementation 'org.springframework.boot:spring-boot-starter-data-r..
[엔티티 설계] @ElementCollection 사용 예시 상품과 상품 이미지가 있다.상품하나에 상품 이미지가 0~n장 까지 존재할 수 있다.그렇다면 상품과 상품 이미지는 일대다 관계로 엔티티를 구성할 수 있다.하지만 DB 테이블 설계 시 상품테이블은 상품마다 상품ID를 가지고상품 이미지는 상품 이미지만의  ID를 가지지 않고 PK가 (상품ID, 상품이미지UUID )라면    상품이미지를 @Entity를 사용하지 않고 @ElementCollection를 사용할 수 있다.DB에 상품1개 상품이미지가 2개 있다고 가정 시 테이블 구조는 아래와 같다.   코드로는 다음과 같다. 상품 엔티티 코드 (상품 이미지 클래스에 @ElementCollection 어노테이션 사용)@Entity@Table(name = "tbl_product")@Getter@ToString(excl..
백준 1194 - Java (BFS,비트마스킹) https://www.acmicpc.net/problem/1194 풀이 이 문제를 보면 기본적으로 bfs를 사용해서 풀 수 있겠다는 생각이 든다.하지만 어려운 부분은 바로a, b, c, d ,e ,f 라는 열쇠와 그에 대응하는A, B, C, D, E, F 라는 문에 대해서이다. 이에 이진법으로 각 열쇠마다 아래와 같이 대입한다 a= 1(2), b = 10(2), c = 100(2) ...그럼 a와 c열쇠를 가지고 있다면 101(2)이 되는것이다.!그렇다면 a,c열쇠를 가진 상태를 정수로 하면 5가 될것이다.int now = 5 // 현재 가진 열쇠정보A라는 문을 만난다면 아래 조건식처럼 계산하면 된다// 예제코드 문에 해당하는 열쇠검사1if ((now & (1  그리고 a~f 까지면 111111(2) 이..
백준 16236 아기상어 - Java https://www.acmicpc.net/problem/16236 풀이문제의 이 조건 때문에 조금 까다로웠다."먹을 수 있는 생선이 한마리면 그것을 먹고  두 마리 이상이면 가장 가까운 거리의 생선을 먹는다. 또한 가장 가까운 거리의 생선이 여러마리면 가장 위에 생선을 먹고가장 위에 생선역시 여러마리면 가장 좌측의 생선을 먹는다"이 부분에서 해맸지만 레벨탐색으로 레벨마다 체크한다면 거리는 따질 필요가 없으니 좌표만을 비교해 구하면 된다는 것을 깨달았다.!!  나의 풀이 순서는 다음과 같다.1. 입력받은 생선이 1마리 이상이면 실행 아니면 0 출력2. 상어가 갈 수 있는 곳을 탐색한다. (상어크기 이하면 갈 수 있음)    2-1. 상어크기와 생선크기다 똑같다. 이동만 수행.    2-2. 상어크기보다 ..
EntityManager 주입 방식 - 생성자 주입 vs 필드 주입 생성자 주입@Repository@RequiredArgsConstructorpublic class 클래스명 { private final EntityManager em;} lombok의 @RequiredArgsConstructor 어노테이션은 final로 정의된 필드를 기반으로 생성자를 자동으로 만들어 준다.그리고 기본적으로 스프링에서 생성자가 하나뿐이면 자동으로 주입해준다.또한 생성자,필드, 수정자 주입 중 스프링에서는 생성자 주입을 가장 권장한다.  - 필드 주입@Repositorypublic class 클래스명 { @PersistenceContext private EntityManager em;} 가장 간결하게 주입할 수 있는 방법이다.@PersistenceContext 어노테이션 말고..
백준 0 만들기 - Java https://www.acmicpc.net/problem/7490  - 예제입력237  - 예제출력1+2-31+2-3+4-5-6+71+2-3-4+5+6-71-2 3+4+5+6+71-2 3-4 5+6 71-2+3+4-5+6-71-2-3-4-5+6+7 풀이요약:"1+2-3" ...  의 식(String)을 만들어 식의 파라미터로 결과값이 0인지 확인하는isZero(String exp)함수로 0이면 해당 식을 리스트에 저장하고테스트 케이스마다 식을 아스키 순서로 정렬 후 최종출력할 StringBuilder sb에 저장. 테스트 케이스 끝나면 최종 정답 출력 1. n 이 3 이라면1 2 3의 숫자에 + , - " "(붙이기)등의 연산자가 필요하다가능한 모든 경우를 계산해야 한다. 여기서 n이 3이면 세 개의 숫..
백준 1776 문제집 - Java https://www.acmicpc.net/problem/1766  * 예제입력4 24 23 1 * 예제출력3 1 4 2 풀이 이 문제는 n가지 문제 중 특정 문제를 먼저 풀어야 한다. 또한 가능하면 쉬운문제(낮은 번호의 문제)부터 풀어야 한다.이렇게 순서가 정해져 있는 작업의 문제는 위상 정렬 (Topological Sorting)알고리즘으로 풀 수 있다. 위상 정렬 알고리즘의 조건은 비순환 방향 그래프여야 한다. 위상 정렬의 구현을 위해서 일반적으로 큐, 배열 , 인접리스트가 필요하다.이제 순서대로 문제를 풀기 위해 단계별로 설명한다. 또한 이 문제는가능한 쉬운 문제, 즉 번호가 낮은 문제부터 풀어야하므로 일반큐 말고 우선순위 큐를 이용할 것이다. 준비단계문제 우선순위에 따라 인접리스트에 저장한다.e..
인터페이스와 추상클래스 차이 추상클래스 -  일반적인 클래스와 동일하게 멤버변수와 메서드를 갖는다.- 추가적으로 추상 메서드를 갖는다. 또한 추상 메서드는 메서드의 선언부만 존재하고 구현코드가 없다- 추상 클래스가 되면 new 키워드를 사용하여 인스턴스화 할 수 없다. 즉 못 쓴다.쓰려면 다른 클래스가 해당 추상 클래스를 상속받아 사용해야 한다. 상속 받은 후 부모 클래스에 존재하는 추상메서드를 전부 오버라이딩 한 뒤 메서드 구현부를 작성하면 사용 가능. - new 키워드를 통해 직접 객체를 생성할 수 없다- 다중상속 ❌ 인터페이스-  추상 클래스의 특수형태. 추상 클래스보다 추상화 정도가 높다.- 멤버 변수와 메서드를 제거한 채 추상 메서드만을 남긴 형태- 인터페이스도 마찬가지로 이를 구현한 자식 클래스에서 인터페이스의 추상 메서..