본문 바로가기

SPRING

(39)
스프링 DB 1편 - 데이터 접근 핵심 원리 (6) 체크 예외와 인터페이스 서비스 계층은 가급적 특정 구현 기술에 의존하지 않고, 순수하게 유지하는 것이 좋다. 이렇게 하려면 예외에 대한 의존도 함께 해결해야 한다. 서비스가 처리할 수 없는 SQLException에 대한 의존을 제거하려면?? -> 리포지토리가 던지는 SQLException 체크 예외를 런타임 예외로 전환해서 서비스 계층에 던진다. 인터페이스 도입 MemberRepository 인터페이스를 도입해서 MemberService가 MemberRepository 인터페이스에만 의존하게 한다. 이렇게 하면 DI를 사용해서 MemberService 코드의 변경 없이 구현 기술을 변경할 수 있다. package hello.jdbc.repository; import hello.jdbc.domain.Mem..
스프링 DB 1편 - 데이터 접근 핵심 원리 (5) 예외 계층 Object : 예외도 객체이다. 모든 객체의 최상위 부모는 Object이므로 예외의 최상위 부모도 Object이다. Throwable : 최상위 예외 이다. Error : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다. 애플리케이션 로직에서는 Throwable 예외도 잡으면 안되는데, Error 예외도 함께 잡을 수 있기 때문이다. 애플리케이션 로직은 이런 이유로 Exception 부터 필요한 예외로 생각하고 잡으면 된다. Exception : 체크 예외 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외이다. Exception 과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다..
스프링 DB 1편 - 데이터 접근 핵심 원리 (4) 트랜잭션 문제점들 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 사용 기술: 서블릿과 HTTP 같은 웹 기술 서비스 계층 비즈니스 로직을 담당 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA 순수한 서비스 계층 여기서 가장 중요한 계층은 핵심 비즈니스 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI와 관련된 부분이 변하고, 데이터 저장 기술을 다른 기술로 변경해도, 비즈니스 로직은 최대한 변경없이 유지되어야 한다. 이렇게 하려면 서비스 계층을..
스프링 DB 1편 - 데이터 접근 핵심 원리 (3) 트랜잭션 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 예를들어 계좌이체라는 거래는 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다. 1.A의 잔고를 10000원 감소 2.B의 잔고를 10000원 증가 시킨다면 데이터베이스가 제공하는 트랙잭션을 기능을 사용한다면 1,2 둘다 함께 성공해야 저장하고 중간에 하나라도 실패하면 거래 전의 상태로 돌아갈 수 있다. 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋(commit) 이라 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백(Rollback) 이라 한다. 트랜잭션 ACID 트랜잭션은 ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다. 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하..
스프링 DB 1편 - 데이터 접근 핵심 원리 (2) 커넥션풀과 데이터소스 이해 커넥션 풀 이해 데이터베이스 커넥션을 획득할 때는 복잡한 과정을 거친다. 1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. 2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID,PW와 기타 부가정보를 DB에 전달한다. 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다. 5. DB는 커넥션 생성이 완료 되었다는 응답을 보낸다. 6. DB 드라이버 커넥션 객체를 생성해서 클라이언트에 반환한다. 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 소모되는 일이다. 이런 문제를 해결하기 위해 커넥션 풀이라는 방법이 있다. 커넥션풀은 커넥션을 관리하는 풀이다. 애플리케이..
스프링 DB 1편 - 데이터 접근 핵심 원리 (1) JDBC 이해 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음 과정을 통해서 데이터베이스를 사용한다. 1. 커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결한다. 2. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 3. 결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. 이러한 방법은 2가지 큰 문제가 있다. 1. 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야한다. 2. 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 그리고 그 결과를 응답 받는 방법을 새로..
김영한 - 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 11일차 파일 업로드 파일을 업로드 하려면 파일은 문자가 아닌 바이너리 데이터를 전송해야 한다. 그리고 보통 폼을 전송할 때 파일만 전송하지 않는다. 예를 들어 이름 , 나이라는 문자 와 파일을 같이 전송 해야 할때 문자와 바이너리를 동시에 전송해야 한다. 이 문제를 해결하기 위해 HTTP는 multipart/form-data라는 전송 방식을 제공한다. multipart/form-data 방식은 다른 종류의 여러 파일과 폼의 내용을 함께 전송할 수 있다. package hello.upload.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.we..
김영한 - 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 10일차 스프링 타입 컨버터 문자를 숫자로 변환하거나, 숫자를 문자로 변환해야하는 것 처럼 개발하다 보면 타입을 변환해야 하는 경우가 많다. package hello.typeconverter.controller; import hello.typeconverter.type.IpPort; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController..