썸네일 트랜잭션(Transaction) 실행 - 3 - DB Lock DB 락 - 개념 이해 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해 세션1이 중간에 rollback을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다. 세션1은 memberA의 금액을 500원으로 변경하고 싶고, 세션2는 같은 memberA의 금액을 1000원으로 변경하고 싶다. 데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다. 다음 예시를 통해 ..
썸네일 트랜잭션(Transaction) 이해 - 2 트랜잭션 실습 1. 기본 데이터 입력 h2 데이터베이스 콘솔을 사용하여 2개의 세션에서 연결하도록 한다. 먼저 기본 데이터를 다음과 같이 맞춘다. 데이터 초기화 SQL //데이터 초기화 set autocommit true; delete from member; insert into member(member_id, money) values ('oldId',10000); 자동 커밋 모드를 사용했기 때문에 별도의 커밋을 호출하지 않아도 된다. 이렇게 데이터 초기화하고, 세션1, 세션2에서 다음 쿼리를 실행하여 결과를 확인하자. select * from member; 결과를 이미지와 비교하자 참고로 이미지의 name 필드는 이해를 돕기 위해 그린 것이고 실제는 없다. 2. 신규 데이터 추가 - 커밋 전 세션 1에..
썸네일 트랜잭션(Transaction) 이해 - 1 트랜잭션 데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위. DB의 상태를 변경시킨다는 것은 SELECT, UPDATE, INSERT, DELETE 같은 쿼리로 연산을 수행하는 것. 그리고 DB에서 트랜잭션은 하나의 작업,거래를 안전하게 처리하도록 보장하는 것이다. 그러나 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 것이 많다. 그 예가 계좌이체이다. 1. A의 잔고를 5000원 감소 2. B의 잔고를 5000원 증가 계좌이체는 위 2가지 작업이 합쳐져 하나의 작업처럼 동작해야 한다. 만약 1번은 성공했으나, 2번에서 시스템 문제가 발생하면 계좌이체는 실패하고 A의 잔고만 5000원 감소하는 대형 사고가 발생한다. 데이터베이스가 제공하는 트랜잭션 기능을 사용하면 1,2 모두 성공해야 저장..
자주 쓰이는 코딩테스트 메소드, 문법 출처: https://earthteacher.tistory.com/169#gsc.tab=0
썸네일 Servlet lifecycle(서블릿 생명주기)
썸네일 커넥션 풀(Connection Pool)과 데이터소스 이해 커넥션 풀 이해 데이터베이스 커넥션 획득 시에 아래와 같은 복잡한 과정을 거친다. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. DB 드라이버는 TCP/IP 커넥션 연결되면 ID, PW와 기타 정보를 DB에 전달한다. DB는 ID, PW를 통해 내부 인증 완료하고 내부에 DB 세션을 생성한다. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. DB 드라이버는 커넥션 객체 생성하여 클라이언트에게 반환한다. 위처럼 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 소모된다. DB는 물론이고 애플리케이션 서버에서도 TCP/IP 커넥션을 새..
썸네일 JDBC 이해 JDBC란? JDBC(Java DataBase Connectivity)는 Java에서 데이터베이스를 접속할 수 있도록 해주는 Java API이다. 등장이유 애플리케이션을 개발 시 중요 데이터는 데이터베이스에 보관한다. 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 아래 과정을 통해서 데이 터베이스를 사용한다. 1. 커넥션 연결: 주로 TCP/IP를 사용하여 커넥션을 연결한다. 2. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 3. 결과 응답: DB는 전달된 SQL를 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. 문제는 각각의 데이터베이스마다 커넥션 연결방법, SQL 전달방법, ..
Spring과 파일 업로드 스프링은 MultipartFile 이라는 인터페이스로 멀티파트 파일을 매우 편리하게 지원한다. SpringUploadController package hello.upload.controller; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.ann..
서블릿과 파일 업로드 파일업로드 소개 일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 두 가지 방식의 차이를 이해해야 한다. HTML 폼 전송 방식 application/x-www-form-urlencoded multipart/form-data application/x-www-form-urlencoded 방식 application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다. Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다. Content-Type: application/x-www-form-urlencoded 그리고 폼에 입력한 전송할 항목을 HTTP B..
스프링이 제공하는 기본 포맷터 스프링은 자바에서 기본으로 제공하는 타입들에 대해 수 많은 포맷터를 기본으로 제공한다. IDE에서 Formatter 인터페이스의 구현 클래스를 찾아보면 수 많은 날짜나 시간 관련 포맷터가 제공되는 것을 확인할 수 있다. 그런데 포맷터는 기본 형식이 지정되어 있기 때문에, 객체의 각 필드마다 다른 형식으로 포맷을 지정하기는 어렵다. 스프링은 이런 문제를 해결하기 위해 애노테이션 기반으로 원하는 형식을 지정해서 사용할 수 있는 매우 유용한 포맷터 두 가지를 기본으로 제공한다. @NumberFormat : 숫자 관련 형식 지정 포맷터 사용, NumberFormatAnnotationFormatterFactory @DateTimeFormat : 날짜 관련 형식 지정 포맷터 사용, Jsr310DateTimeForm..
포맷터 - Formatter 앞서 본 Converter 는 입력과 출력 타입에 제한이 없는, 범용 타입 변환 기능을 제공한다. 이번에는 일반적인 웹 애플리케이션 환경을 생각해보자. 불린 타입을 숫자로 바꾸는 것 같은 범용 기능 보다는 개발자 입장에서는 문자를 다른 타입으로 변환하거나, 다른 타입을 문자로 변환하는 상황이 대부분이다. 앞서 살펴본 예제들을 떠올려 보면 문자를 다른 객체로 변환하거나 객체를 문자로 변환하는 일이 대부분이다. 웹 애플리케이션에서 객체를 문자로, 문자를 객체로 변환하는 예 화면에 숫자를 출력해야 하는데, Integer String 출력 시점에 숫자 1000 문자 "1,000" 이렇게 1000 단위에 쉼표를 넣어서 출력하거나, 또는 "1,000" 라는 문자를 1000 이라는 숫자로 변경해야 한다. 날짜 객체를..
스프링 타입 컨버터 - 컨버전서비스(ConversionService) 타입 컨버터를 하나하나 직접 찾아서 타입 변환에 사용하는 것은 매우 불편하다. 그래서 스프링은 개별 컨버터를 모아두고 그것들을 묶어서 편리하게 사용할 수 있는 기능을 제공하는데, 이것이 바로 컨버전 서비스( ConversionService )이다. ConversionService 인터페이스 package org.springframework.core.convert; import org.springframework.lang.Nullable; public interface ConversionService { boolean canConvert(@Nullable Class sourceType, Class targetType); boolean canConvert(@Nullable TypeDescriptor sour..