BackEnd 106

스프링 예외 추상화

스프링은  데이터 접근과 관련된 다양한 예외를 추상화하여 제공한다.  예외의 최고 상위는 org.springframework.dao.DataAccessException 이고 그 밑은 NonTransient예외와 Transient예외로 나뉜다. NonTransient 예외 = 일시적이지 않은 오류(SQL 문법 오류, 데이터 베이스 제약조건 위배 ...)Transient 예외 =  SQL을 다시 시도했을때 성공할 가능성이 있는 예외 스프링 예외 변환기 스프링은 데이터베이스에서 발생하는 오류 코드를 스프링이 정의한 예외로 자동으로 변환해주는 변환기를 제공한다. package hello.jdbc.exception.translator;import lombok.extern.slf4j.Slf4j;import org...

BackEnd/Database 2025.02.04

TransactionTemplate

//트랜잭션 시작TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //비즈니스 로직bizLogic(fromId, toId, money); transactionManager.commit(status); //성공시 커밋} catch (Exception e) { transactionManager.rollback(status); //실패시 롤백throw new IllegalStateException(e); } 위 코드는 보면 비즈니스 로직이 성공하면 commit을 하고 실패하면 rollback을 한다. 이러한 비즈니스 로직이 여러개라면 커밋과 롤백 코드를 각각의 비즈..

BackEnd/Database 2025.02.01

DB 락

서로 다른 세션에서 동시에 같은 데이터를 수정하게 되면 치명적인 오류가 발생한다. 이러한 문제를 방지하기 위해 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에 서 해당 데이터를 수정할 수 없게 막아야 하는데 이러한 기능을 하는게 DB 락 이라는 개념이다.   set autocommit false; update member set money=500 where member_id = 'memberA'; 세션1에서 락을 획득하고 money를 500으로 변경하고 커밋을 안했다.   SET LOCK_TIMEOUT 60000; set autocommit false; update member set money=1000 where member_id = 'memberA'; 이때 세션..

BackEnd/Database 2025.01.19

커넥션 풀 / DataSource

커넥션 풀 데이터베이스 커넥션을 획득하기 위해서는 DB드라이버가 DB와 TCP/IP커넥션을 연결한다. DB 드라이버는 TCP/IP 커넥션이 연결되면  ID/PW와 기타 정보를 DB에 전달한다. 그 후 DB 내부인증이 완료되면 DB세션이 생성되고  DB드라이버가 커넥션 객체를 생성하여 클라이언트에 반환한다. 하지만 이러한 방법은 과정도 복잡하고 시간도 오래걸린다. 이러한 문제를 해결해주는게 커넥션 풀이다.  DB 드라이버는 필요한만큼 커넥션을 미리 생성하여 풀에 보관한다. 이때 커넥션들을 모두 TCP/IP로 DB와 연결된 상태이다.  따라서 클라이언트는 필요할때마다 커넥션을 생성하는 것이 아닌, 커넥션 풀에서 커넥션을 객체 참조로 가져다 쓰기만 하면된다. 사용된 커넥션들은 다시 커넥션 풀로 이동하여 다시 ..

BackEnd/Database 2025.01.13

데이터베이스 연결, JDBC개발 - 등록, 조회, 수정 ,삭제

서버와 데이터베이스를 연결하는 방법에 대해서 공부했다. 사용된 데이터베이스 : H2    데이터베이스에 접근하기위해 필요한 정보들을 상수로 만들어 관리package hello.jdbc.connection;public abstract class ConnectionConst { public static final String URL = "jdbc:h2:tcp://localhost/~/test"; public static final String USERNAME = "sa"; public static final String PASSWORD = "";}   데이터베이스에 연결하려면 JDBC가 제공하는 DriverManager.getConnection(..) 을 사용하면 된다.이렇게 하면 라이브러리..

BackEnd/Database 2025.01.12

JDBC란 무엇인가

JDBC란? JDBC등장 전에는 다음과 같은 어려움이 존재했다. 1. 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함 께 변경해야 한다. 2. 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 그리고 그 결과를 응답 받는 방법을 새로 학습해야 한다.  JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. - 위키백과  개발자는 사용되는 데이터베이스가 변경되어도 JDBC 구현 라이브러리만 변경하면 된다. 따라서 다른 종류의 데이터베이스로 변경해도 애플리케이션 서버의 사용 코드를 그대로 유지할 수..

BackEnd/Database 2025.01.11

스프링을 이용한 파일 업로드, 다운로드

스프링의 MultipartFile 인터페이스를 이용하여 파일 업로드를 쉽게 구현 가능하다. package com.example.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.annotation.PostMapping;impor..

스프링 - 파일 업로드(1)

폼 전송의 두가지 방식은 다음과 같다.  application/x-www-form-urlencoded 방식  HTTP Body에 문자형식으로 &로 구분하여 전송한다. 하지만 이러한 방식에는 한계가 있는데, 파일을 업로드 할때는 바이너리 데이터를 전송해야 하는데 이러한 방식으로는 파일 업로드가 힘들다. 따라서 multipart/form-data 전송 방식을 사용해야 한다. multipart/form-data 방식이 방식을 사용하면 각각의 전송 항목이 Content-Disposition이라는 헤더로 구분된다. 폼의 일반 데이터는 각 항목별로 문자가 전송되고, 파일의 경우 파일 이름과 Content-Type이 추가되고 바이너리 데이터가 전송된다.  직접 서버에 파일 업로드 해보기 application.prop..

포맷터 - Formatter , @NumberFormat, @DateTimeFormat

웹 애플리케이션에서 객체를 문자로, 문자를 객체로 변환할때 유용하게 사용할 수 있는 포맷터에 대해서 공부했다. ex)숫자에 1000단위로 쉼표를 넣어야 하는 경우 OR"1,000"이라는 문자를 1000이라는 숫자로 변경 해야하는 경우  이때 사용할 수 있는것이 Locale이다.Locale ==> 날짜나 숫자표현 방법에 대한 현지화 정보  package com.example.typeconverter.formatter;import lombok.extern.slf4j.Slf4j;import org.springframework.format.Formatter;import java.text.NumberFormat;import java.text.ParseException;import java.util.Locale;@..

@ExceptionHandler

스프링에서 API예외 처리 문제를 해결하기 위해 @ExceptionHandler를 제공한다. 매우 편리하여 사용하기 쉽다. package com.example.exception.api;import com.example.exception.Exception.UserException;import com.example.exception.exhandler.ErrorResult;import lombok.AllArgsConstructor;import lombok.Data;import lombok.extern.slf4j.Slf4j;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.sprin..