본문 바로가기

전체 글44

[ Java / Spring Boot ] 서비스 객체는 하나인데, 여러 요청을 동시에 처리해도 괜찮을까? Spring Boot에서 서비스를 만들 때 보통 이렇게 작성한다.@Servicepublic class OrderService { // 주문 처리}별도의 스코프를 지정하지 않았다면 이 빈은 기본적으로 싱글톤이다.그런데 여기서 조금 이상한 생각이 든다.“객체가 하나면 요청도 하나씩 처리하는 건가?”“여러 사람이 동시에 호출하면 데이터가 섞이지 않나?”하나의 객체를 여러 스레드가 동시에 사용할 수 있다.그리고 코드를 어떻게 작성했느냐에 따라 데이터가 섞일 수도 있다.(싱글톤이라고 Spring이 줄을 세워주는 건 아니었다.)1. 싱글톤은 정확히 무엇이 하나라는 뜻일까?Spring의 싱글톤 스코프는 기본적으로 컨테이너 하나에서 빈 정의 하나당 인스턴스 하나를 공유한다는 뜻이다.특정 클래스의 객체가 프로그램 .. 2026. 9. 16.
[ Java ] 메서드는 하나 만들었는데, 컴파일하면 두 개가 된다고? 자바에서 제네릭을 공부하다 보면 이런 설명을 보게 된다.“제네릭 타입은 컴파일할 때 소거된다.”그렇구나 하고 넘어갔는데, 생각해보니 조금 이상하다.T가 Object로 바뀐다면, T 대신 String을 받도록 구현한 메서드는 어떻게 연결되는 걸까?이번에는 이 과정에서 컴파일러가 만들어주는 **브리지 메서드(Bridge Method)**를 살펴보자.내가 작성하지 않은 메서드가 클래스에 들어가 있다.(누가 넣었나 했더니 컴파일러였다.)1. 분명히 메서드는 하나만 작성했는데?간단한 인터페이스를 만들어보자.interface Receiver { void receive(T value);}그리고 문자열을 받는 클래스를 구현한다.class TextReceiver implements Receiver { @Ove.. 2026. 9. 16.
[ Java / Spring Boot ] @Transactional 붙였는데 데이터가 왜 남아있지? Spring Boot로 개발하다 보면 트랜잭션이 필요한 메서드에 자연스럽게 @Transactional을 붙이게 된다.중간에 예외가 터지면 롤백되겠지?그런데 분명히 어노테이션도 붙였고 예외도 발생했는데, DB를 열어보니 데이터가 그대로 남아 있다면?이번에는 이 상황을 직접 실행해봤다.똑같은 INSERT와 똑같은 예외를 사용했는데, 메서드를 어떻게 호출했는지에 따라 결과가 달라졌다.1. 일단 데이터를 넣고 예외를 터뜨려보자실험 환경은 다음과 같다.Java 21.0.6Spring Boot 3.2.5 / Spring Framework 6.1.6H2 2.2.224 메모리 DBJdbcTemplate + DataSourceTransactionManager이번에는 Spring이 트랜잭션을 적용하는 호출 경로에 집중하기.. 2026. 9. 15.
[ Python ] 기본값에 []를 넣었는데, 왜 이전 데이터가 남아 있을까? 파이썬에서 함수를 만들 때, 기본값을 지정하면 편합니다.def greet(name="우당탕탕"): print(f"안녕하세요, {name}님!")인자를 생략하면 기본값을 사용합니다.그렇다면 리스트도 이렇게 작성하면 되지 않을까요?def add_item(value, items=[]): items.append(value) return items리스트를 전달하지 않으면 빈 리스트에 추가하겠다는 뜻처럼 보입니다.그런데 두 번 호출하면 조금 이상해집니다.먼저 결과부터 보겠습니다print(add_item("A"))print(add_item("B"))기대했던 결과는 다음과 같습니다.['A']['B']실제 결과는?['A']['A', 'B']앞에서 넣었던 A가 남아 있습니다.(함수가 기억력이 좋네요..)이.. 2026. 9. 15.
[ Database ] LIMIT 20인데, 뒤 페이지로 갈수록 왜 느려질까? 게시판을 만들다 보면, 페이지네이션을 구현하게 됩니다.한 페이지에 20개씩 보여준다면 보통 이렇게 작성합니다.SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 0;다음 페이지는?SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 20;간단합니다.그런데 데이터가 쌓이고 뒤쪽 페이지로 넘어가면, 점점 느려지는 경우가 있습니다.SELECT id, titleFROM postsORDER BY id DESCLIMIT 20 OFFSET 100000;“어차피 가져오는 건 20개인데, 왜 차이가 나지?”(20개만 달라고 했잖아요..ㅜㅜ)이번에는 MySQL(혹은 MariaDB)에서 OFFSET이 어떤 일을 만드는지 알.. 2026. 9. 15.
[ Java ] subList()로 잘랐는데, 원본까지 바뀐다고? 리스트에서 일부 데이터만 가져오고 싶을 때, subList()를 사용하기도 합니다.List part = original.subList(1, 4);1번 인덱스부터 4번 인덱스 직전까지.사용법은 간단합니다.그런데 여기서 가져온 데이터를 수정하면 어떻게 될까요?part.set(0, "X");잘라 온 리스트만 바뀔 것 같지만, 원본 리스트도 바뀝니다.“분명 다른 변수에 담았는데..?”이번에는 ArrayList의 subList()가 내부에서 무엇을 만드는지 알아보겠습니다.※ 내부 구현 설명은 OpenJDK 21의 ArrayList를 기준으로 합니다.먼저 코드부터 보겠습니다List original = new ArrayList( List.of("A", "B", "C", "D", "E"));List part = .. 2026. 9. 14.