본문 바로가기

Development

(98)
[Diary] Spring 비관적 락(Pessimistic Lock)과 Transaction Isolation level의 조합으로 발생할 수 있는 현상(+Snapshot Isolation) 이 글에서는 비관적 락을 사용하였음에도 멀티 스레드 환경에서 원하는 결괏값이 나오지 않아 발생한 문제 상황에 대해 작성하고자 합니다.문제 상황: 한 스레드가 새로운 레코드를 Insert 하고 다른 스레드가 findAll() 했을 때 새로운 레코드를 읽지 않는다?문제 재현UserTest@Entity@Getter@Setterpublic class UserTest { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false) private String username;}UserTestRepository@Repositorypublic interface UserTestRepos..
[Diary] Spring 테스트 관리 트랜잭션(Test-managed transactions)과 테스트 생명주기 + 멀티 스레드에서 테스트 문제 Spring에서 테스트 관리 트랜잭션(Test-managed transactions)은 통합 테스트(integration test) 중에 트랜잭션이 자동으로 관리되고, 테스트 메서드가 종료되면 자동으로 롤백되는 트랜잭션입니다. 이러한 트랜잭션은 Spring에서 관리되는 트랜잭션(테스트를 위해 로드된 ApplicationContext 내에서 직접적으로 Spring에 의해 관리되는 트랜잭션)이나 애플리케이션에서 관리되는 트랜잭션(테스트에서 호출되는 애플리케이션 코드 내에서 프로그래밍 방식으로 관리되는 트랜잭션)과는 다릅니다. 메서드 수준의 생명주기 메서드(예: JUnit Jupiter의 @BeforeEach 또는 @AfterEach로 주석이 달린 메서드)는 테스트 관리 트랜잭션 내에서 실행됩니다. 반면 클래..
[Spring] ThreadLocal에 대해 알아보자 + SecurityContextHolder, RequestContextHolder Java Spring에서는 Thread 마다 고유한 데이터를 가지기 위해 ThreadLocal 클래스를 사용합니다. 이 글에서는 ThreadLocal이 무엇이며 어디서 활용되고 있는지에 대해 알아보겠습니다.Thread스레드(Thread)는 프로세스 내에서 실행되는 가장 작은 단위의 작업이다. 하나의 프로세스는 여러 스레드를 가질 수 있으며, 각 스레드는 독립적으로 실행된다. 스레드는 동일한 메모리 공간을 공유하며, 서로 다른 스레드가 동시에 실행될 수 있기 때문에 멀티스레딩을 통해 병렬 처리가 가능해진다. Spring 애플리케이션, 특히 웹 애플리케이션에서는 일반적으로 요청당 스레드(Thread-Per-Request) 모델을 사용한다.이는 클라이언트의 HTTP 요청마다 별도의 스레드를 생성하여 그 요청을..
[그리디] 백준 13904번 과제 java 풀이 https://www.acmicpc.net/problem/13904 푸는 법은 단순합니다. [마감 날짜, 점수] 배열을 저장하는 이중 배열 선언그리고 점수를 내림차순 정렬 한다날짜 별로 해결한 과제의 점수를 저장하는 배열 선언  이중 배열을 순회하면서 날짜 별로 가장 높은 점수를 3번에서 선언한 배열에 저장한다.import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws Exception { BufferedReader ..
[SWEA] [S/W 문제해결 기본] 3일차 - 회문1 Java 풀이 https://swexpertacademy.com/main/talk/solvingClub/problemView.do?contestProbId=AV14QpAaAAwCFAYi&solveclubId=AV6kld8aisgDFASb&problemBoxTitle=%5BD2%7ED3+%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4%5D+%EA%B8%B0%EC%B4%88+%EB%8B%A4%EC%A7%80%EA%B8%B0+Part4&problemBoxCnt=14&probBoxId=AV-4MojKLNADFATz SW Expert AcademySW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!swexpertacademy.com문제 설명8x8 문자가 저장되어 있는 격자판에 가로, 세로..
[Spring] Spring Security의 Authentication과 SecurityContext 동작, 그리고 Authentication을 얻는 방식 서론 @Transactional(readOnly = true) public UserResponseDto getUserProfile(Authentication authentication) { return userMapper.toUserResponseDto(UserUtil.getUserFromAuthentication(authentication)); }이 코드가 있고@Transactional(readOnly = true) public UserResponseDto getUserProfile() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); re..
[Spring] 테스트 환경을 독립적으로 만들어보자 H2 DatabaseH2 Database는 다음과 같은 특징을 가진 인메모리 데이터베이스이며, 메모리에 데이터를 정하기 때문에 매우 빠른 속도를 제공한다.또한 파일 기반으로 작동하기 때문에 별도의 서버 설치가 필요하지 않다.H2 데이터베이스는 JDBC 드라이버를 제공하기 때문에 대부분의 JDBC 기반 프레임워크와 호환된다. JDBC?JDBC는 Java Database Connectivity의 약자로, 자바 프로그래밍 언어에서 데이터베이스에 접근하고 데이터를 조작하기 위한 표준 API이다.JDBC를 사용하면 Java 코드를 통해 데이터베이스에 연결하고, SQL 쿼리를 실행하고, 결과를 처리하며, 데이터를 삽입, 수정, 삭제할 수 있다.H2 DB는 빠른 속도와 간편한 설정으로 인해 개발 및 테스트 ..
[Spring] Spring Security에서 지원하는 Logout과 JWT 기반 Logout 구현의 차이 스프링 공부를 위해 구입한 도서에서는 JWT 기반 회원가입, 로그인 기능은 있어도 로그아웃은 없길래 로그아웃 기능은 어떻게 구현할까 찾아보았다. 기능 추가를 하려면 새 DB를 써야해?? 구글링으로 스프링 JWT 기반 로그아웃 기능을 어떻게 구현했는지 찾아보았는데 Redis를 사용해서 로그인 시 Token 데이터를 저장하고, 로그아웃 시 Redis에서 토큰 데이터를 지우는 방식으로 구현하였다. 로그아웃 하려고 DB를 새로 추가하라니.. 그럼 로그인 기능도 바꿔주어야 하는 것 아닌가..란 생각이 들었다. 그래서 다른 방법을 찾기 위해 Spring Security에서 지원하는 Logout에 대해 알아보았다. Spring Security에서 기본으로 제공하는 Logout https://docs.spring.io..