Spring boot에서 서비스단에서 데드락이 발생하였다. 예시)@Service@RequiredArgsConstructorpublic class AService { private final BService bService; @Transactional public void update(Object o) { updateA(o); bService.updateB(o); }}@Service@RequiredArgsConstructorpublic class BService { @Transcational(propagation=REQUIRES_NEW) public void updateB(Object o) { ... }} 일반적인 코드로 updat..
트랜잭션은 쿼리 실행하는 도중에 에러가 난 경우 rollback 처리를 해준다.스프링의 @Transactional에는 Spring AOP의 proxy 방식이 사용된다.예외가 발생한 경우의 트랜잭션 상태예시 1) 같은 서비스 단의 함수를 호출하는 경우import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Service;@Service@RequiredArgsConstructorpublic class AService { private final ARepository aRepository; private final BRepository bRepository; @Transcational public void up..
Partition이란?기준을 가지고 테이블을 여러 개의 테이블로 분리하여 저장하는 기법이다.논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하여 관리할 수 있게 한다.여러 개의 파티션이 있어도 사용자는 하나의 테이블로 보인다.대용량의 테이블을 물리적으로 여러 개의 소규모 테이블로 분산하는 목적으로 사용한다.데이터가 많을 때 사용하면 무조건 효율적은 것은 아니며 테이블의 크기가 너무 커서 인덱스의 크기가 물리적인 메모리보다 크거나 주기적인 삭제 작업이 필요한 경우에 사용한다.인덱스의 워킹 셋이 실질적인 물리 메모리보다 크면 쿼리 처리가 느려지기 때문이다.특히 이력을 쌓는 로그 테이블을 파티션을 이용해 관리한다면 불필요한 데이터 삭제 작업을 간단하게 진행할 수 있다.Partition 정의..
Spring Boot를 이용해서 엑셀 다운로드 하는 방법이 많이 있다.Java 8Spring Boot + MyBatis요구사항: nn 만 건 이상의 데이터 엑셀 다운로드1. 문제 상황기존 개발되어있던 엑셀 다운로드 기능을 사용하여 마찬가지로 전체 데이터를 List로 조회하고 SXSSFWorkbook로 엑셀을 생성하여 개발하였다.public Class ProductMapper { List selectProductLists();}15만건의 데이터로 테스트해 본 결과 OutOfMemoryException이 발생하였다.List로 데이터를 가져오는 경우 List의 데이터를 전부 한 번에 적재하기 때문에 heap 메모리가 가득 차게 되었다.2. 수정 방법1. List -> CursorList가 한 번에 데이터..
Spring에서는 @Async와 ApplicationEventPublisher를 이용해 비즈니스 로직과 부가 로직을 자연스럽게 분리하여 비동기 처리를 구현할 수 있다.ApplicationEventPublisher란ApplicatoinEventPublisher는 Spring 내부에서 이벤트를 발행(Publish)하고 해당 이벤트를 처리하는 Listener를 찾아 호출해주는 기능이다.> Publisher는 이벤트를 던진다.> Listener는 해당 이벤트를 동기/비동기로 처리한다. [AS-IS] 회원가입 로직예시를 들어보자면 회원 가입 시 슬랙에 회원가입한 사용자가 생겼다는 알림을 보내는 코드가 있다.private User signup(AuthSignInRequestDTO request) { User ..
코드를 짤 때 오늘 날짜, 랜덤값과 같이 변하는 값을 테스트할 때가 있다.이 값들의 결과에 따라 로직이 달라진다면 이 경우 또한 테스트를 하는게 좋다. - orderNumber가 존재한다면 해당 주문번호의 주문날짜를, 없다면 현재 날짜를 반환해야한다. private String getOrderDate(String orderNumber) { if(StringUtils.isNotEmpty(orderNumber) { return orderDate; } ZoneDateTime seoulDateTime = ZoneDateTime.now(ZoneId.of("Asia/Seoul"); return seoulDateTime.format(Date..
1. ParameterizedTest여러 개의 변수를 테스트해야 할 때 직접 입력하기보다 인자값으로 설정하여 간단하게 테스트할 수 있다.인자값을 이용하여 테스트할 때 사용한다.@ParameterizedTest는 단독으로는 사용할 수 없으며 인자값을 넣어주는 다른 어노테이션과 같이 사용할 수 있다.2. @ValueSource[as-is] private Set numbers; @BeforeEach void setUp(){ numbers = new HashSet(); numbers.add(1); numbers.add(2); numbers.add(3); } @DisplayName("1,2,3의 값이 set에 존재한다.") publ..
프리티어가 끝나면서 요금 폭탄을 맞게 되어 새로운 AWS 계정으로 이관을 진행했습니다. 옮긴 서비스는 EC2 + codeDeploy, RDS로 현재 이용중인 서비스이기 때문에 RDS 이관은 필수였습니다.출발 계정을 계정A, 목적지 계정을 계정B라고 하겠습니다. 1. 계정A에서 스냅샷 생성하기계정A의 RDS에 접속하여 작업 > 스냅샷 생성을 클릭합니다. 스냅샷 생성할 때 DB 인스턴스로 선택한 후에 스냅샷 이름을 지어줍니다. 생성된 스냅샷에서 이제 스냅샷 공유를 클릭합니다. 여기서 계정B의 AWS ID를 입력 후 저장합니다.+) AWS ID는 화면 우측 상단의 본인 계정 이름을 선택하면 밑에 토글로 나옵니다.이제 계정A에서의 할 일은 끝났습니다. 2. 계정B에서 DB로 복원하기계정B에 접속하여 RDS >..
흔히 개발 수업 시간에서 배운 call-by-value와 call-by-reference에 대해서 배웠었다. 몇 년만에 왜 이걸 다시 공부하게 되었을까? 기존의 코드 @Getter @RequiredArgsConstructor public class Car { private Long id; private String name; private String sellingDate; private List carPartList; @AllArgsConstructor public static class CarPart { private Long partId; private String partName; private boolean isAvailable; } }데이터베이스에서 Car 타입의 리스트를 받아온다. 밑의 코드..
다양한 서버 모니터링이 있지만 Upptime을 이용해서 서버 모니터링을 진행하였습니다. 사용한 이유 1. 간단한 모니터링을 하고 싶어서 2. 수시로 알아서 진행되는 모니터링을 하고 싶어서 3. 큰 리소스가 들지 않는 편에서 하고 싶어서 4. 서버 상태를 확인하고 싶어서 위의 이유로 upptime을 설정하였습니다. https://github.com/upptime/upptime 이 사이트로 접속합니다. Create a new repository를 클릭합니다. 모니터링을 하고 싶은 그룹이나 사용자에 Repository를 설정합니다. initial commit이란 말과 함께 기본적인 환경이 설정되었습니다. 이제 모니터링을 원하는 사이트에 실행하겠습니다. .upptimerc.yml을 수정하겠습니다. # Chang..
이를 구현하기 위해서는 먼저 카카오 디벨로퍼스에서 내 애플리케이션 만들기를 해야 합니다. 단건 결제의 구현 순서는 결제 준비하기 -> 결제 승인하기 입니다. 0. 기본값 설정하기 그 전에 필요한 APP_ADMIN_KEY와 CID 값을 .yml에 넣어 숨깁니다. kakaopay: admin-key: XXXXX cid: TC0ONETIME admin-key값은 카카오 디벨로퍼스에서 내 애플리케이션 만들기를 통해 얻을 수 있습니다. 그 다음에 위의 값들을 사용하기 위해 Component로 설정합니다. @Component public class KakaoPayProperties { public static String adminKey; public static String cid; public static St..
0. QueryDSL이란? public interface ItemRepository extends JpaRepository { @Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc") List findByItemDetail(@Param("itemDetail")String itemDetail); } 위의 코드와 같이 직접 Query문을 작성하게 되면 두 가지의 단점이 있습니다. 1. 문제가 발생하는 경우 런타임 시점에 알게 됩니다. 2. 하나하나 타이핑을 해야한다.. 위의 예제는 비교적 짧지만 join이 들어간 경우 여러 줄로 작성해야 했는데 그 과정에서 띄어쓰기로 인해 작동이 안되는 경우를 겪었습니다..
- Total
- Today
- Yesterday
- MySQL
- transactional
- 백준
- 우분투설치
- 뉴스클러스터링
- 최솟값구하기
- PasswordEncoder
- 운영체제
- 정수삼각형
- OS
- 괄호회전하기
- AWS
- dp
- RDS
- 영어끝말잇기
- ubuntu
- 이진변환반복하기
- 프리티어
- xv6
- springboot
- 최고의집합
- Auditing
- Android
- Spring
- 응답코드
- 시스템콜
- 머신러닝
- 실패율
- 프로그래머스
- 다음큰숫자
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 |
| 30 | 31 |