썸네일 트랜잭션(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 모두 성공해야 저장..
썸네일 커넥션 풀(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..
스프링 타입 컨버터 - Converter 타입 컨버터를 사용하려면 org.springframework.core.convert.converter.Converter 인터페이스를 구현하면 된다. 주의 Converter 라는 이름의 인터페이스가 많으니 조심해야 한다. org.springframework.core.convert.converter.Converter 를 사용해야 한다. 컨버터 인터페이스 package org.springframework.core.convert.converter; public interface Converter { T convert(S source); } 먼저 가장 단순한 형태인 문자를 숫자로 바꾸는 타입 컨버터를 만들어보자. StringToIntegerConverter - 문자를 숫자로 변환하는 타입 컨버터 package h..
API 예외 처리 - @ControllerAdvice @ExceptionHandler 를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만, 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다. @ControllerAdvice 또는 @RestControllerAdvice 를 사용하면 둘을 분리할 수 있다. ExControllerAdvice package hello.exception.exhandler.advice; import hello.exception.exception.UserException; import hello.exception.exhandler.ErrorResult; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springfr..
API 예외처리 - @ExceptionHandler HTML 화면 오류 vs API 오류 웹 브라우저에 HTML 화면을 제공할 때는 오류가 발생하면 BasicErrorController 를 사용하는게 편하다. 이때는 단순히 5xx, 4xx 관련된 오류 화면을 보여주면 된다. BasicErrorController 는 이런 메커니즘을 모두 구현해두었다. 그런데 API는 각 시스템 마다 응답의 모양도 다르고, 스펙도 모두 다르다. 예외 상황에 단순히 오류 화면을 보여주는 것이 아니라, 예외에 따라서 각각 다른 데이터를 출력해야 할 수도 있다. 그리고 같은 예외라고 해도 어떤 컨트롤러에서 발생했는가에 따라서 다른 예외 응답을 내려주어야 할 수 있다. 한마디로 매우 세밀한 제어가 필요하다. 앞서 이야기했지만, 예를 들어서 상품 API와 주문 API는 오류가 발생했..