스프링 부트에서는 @Transactional 어노테이션을 이용하여 복잡한 트랜잭션 처리를 단순화한다.클래스, 메서드 단위로 어노테이션을 추가할 수 있고,스프링이 AOP를 통해 프락시를 도입하여 트랜잭션 처리를 모두 해결해 준다. @Transactional 세부 설정트랜잭션의 세부 설정을 통해 상황별로 적절한 설정을 하여 성능을 최적화할 수 있다.@Transactional 세부 설정 종류Isolation (격리 수준 설정)Propagation(전파 수준 설정)readOnly 속성트랜잭션 롤백 예외 설정time-out 설정 1. Isolation(격리 수준)일관성이 깨지는 것을 어느 정도까지 허용하느냐에 대한 설정이다. 기본 설정은 DEFAULT이다.@Transactional(isolation=Isol..
[JDBC] 트랜잭션 적용 - Connection 직접 이용JDBC 코드를 직접 짤 때 트랜잭션을 이용하는 방법이다. 비즈니스 로직을 실행할 때, 하나의 커넥션 내에서 동작해야 하므로 메서드 사용 시 connection을 파라미터로 넘겨야 한다.따라서 서비스 계층, 데이터접근 계층에 모두 Connection을 파라미터로 받아서 이용해야 한다.public void loadLotsOfData(DataList dataList) { String sql = "insert into table values ( /* ... */)"; Connection conn = null; PreparedStatement pstmt = null; try { con..
DB Lock (락) DB Lock(락)은 하나의 데이터를 다른 세션에서 수정하는 것을 방지하는 것이다. 만약 세션 A에서 데이터를 수정하기 위해 트랜잭션을 진행 중이고 아직 커밋 또는 롤백을 수행하지 않았는데, 다른 세션 B에서 동시에 같은 데이터를 수정하게 된다면 여러 가지 문제가 발생할 것이다. 트랜잭션의 원자성이 깨지는 것이다. DB Lock은 이런 문제를 방지하기 위해 트랜잭션을 시작하고 해당 트랜잭션(세션)이 종료되기 전까지 다른 세션에서 해당 데이터를 수정할 수 없도록 막아주는 역할을 한다. 락을 고려한 트랜잭션 과정 락(Lock)은 해당 데이터 수정에 대한 권한 같은 것으로 생각하면 된다. 트랜잭션을 시작하고 쿼리를 실행함과 동시에 락을 획득한다. 획득한 락은 트랜잭션 종료(커밋/롤백) 시..
트랜잭션(Transaction)이란? 트랜잭션은 하나의 데이터 교환 또는 변경을 안전하게 처리하도록 보장해 주는 것을 의미한다. 한 번의 애플리케이션 로직으로 인해 두 개 이상의 데이터가 영향을 받는 경우, 각각의 데이터에 대한 변경이 완전하게 끝난 후 데이터베이스에 정상적으로 반영하는 것이다. 만약 데이터 처리 중 문제가 발생 시 로직 실행 전으로 되돌리는 기능을 지원한다. 데이터베이스에 정상적으로 반영하는 것을 커밋(Commit) , 되돌리는 것을 롤백(Rollback)이라고 한다. 트랜잭션 ACID 속성 ACID는 트랜잭션을 정의하는 4가지 중대한 속성을 가리키는 약어입니다. 즉 원자성, 일관성, 신뢰성, 격리 그리고 영속성을 의미합니다. 원자성(Atomicity) 트랜잭션 내에서 실행한 작업들은 ..
이번 게시글은 면접 예상 질문과 저라면 어떻게 대답할지에 대해 적어봤습니다. 각자 아래 질문에 어떻게 대답할지 생각해 보시면 좋을 것 같습니다. "접은 글"로 제 기준 대답 키워드를 적어놨는데, 피드백이나 의견 댓글로 남겨주시면 감사하겠습니다, [기술 관련] 💡 Java/Spring Boot/JPA를 활용한 REST API 서버 개발 경험 ⬇️키워드 더보기 REST 방식으로 URL로 자원 명시, HTTP Method로 처리 방법을 지정 SpringBoot의 Spring MVC 구조, 레이어드 아키텍처 이용 Controller 단에서 클라이언트 요청 처리 Service 단에서 비즈니스 로직 처리 데이터 접근 계층은 Spring data JPA를 이용하여 JpaRespository 인터페이스를 사용 💡 RD..
Item 15 : 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 내부 구현을 완벽히 숨겨서, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 여기서 말하는 것은 정보 은닉, 캡슐화이다. 정보 은닉의 장점은 컴포넌트들을 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해 준다. 정보 은닉, 캡슐화의 장점 개발 속도 향상 : 여러 컴포넌트를 병렬로 개발하는 것이 가능하다. 관리 비용 절감 : 각 컴포넌트를 더 빨리 파악할 수 있고, 다른 컴포넌트로 교체하는 부담도 적다. 성능 최적화에 기여 : 시스템 전체에서 최적화할 컴포넌트를 정해서, 특정 컴포넌트만 최적화할 수 있다. 재..
여러 문자열을 이어 붙일 때 보통 StringBuilder를 사용했었습니다. 그런데 특정 상황에서 더 유용한 클래스가 있어서 소개하려 합니다. StringBuilder를 썼을 때 아쉬운 점 아래와 같이 반복문으로 문자열을 이어 붙일 때 마지막에 구분자가 append 되는 것을 처리해야 하는 문제가 있다. String[] arr = {"one", "two", "three"}; StringBuilder sb = new StringBuilder(); for(int i = 0; i < arr.length; i++){ if(i == arr.length - 1){ sb.append(arr[i]); break; } sb.append(arr[i]).append(","); } System.out.println(sb); ..
깊은 복사 vs 얕은 복사 Java에서 객체를 복사할 때, 깊은 복사와 얕은 복사라는 개념이 있다. 간단하게 정리하자면 깊은 복사 : 실제 값을 새로운 메모리 공간에 복사하는 것이고, 얕은 복사 : 주소 값을 복사하는 것이다. 간단 예제 아래 예제를 통해 일단 간단히 알아보자. int[] original = new int[]{1,2,3}; int[] shallowCopy = original; //얕은 복사 int[] deepCopy = original.clone(); //깊은 복사 //주소 값 확인 System.out.println("주소-original = " + System.identityHashCode(original)); //주소-original = 191382150 System.out.print..