Spring 42

[Spring] 스프링 데이터베이스(5) - 트랜잭션 전파와 격리 레벨

트랜잭션 전파와 격리 레벨 현재 진행 중인 트랜잭션이 있는 상태에서 새로운 트랜잭션을 시작하고 싶다면 다음과 같이 새로운 커넥션을 가져와 트랜잭션을 시작할 수 있다. Connection conn = getConnection(); conn.setAutoCommit(false); // 중간 생략 ... Connection connNew = getConnection(); connNew.setAutoCommit(false); // 새로운 커넥션으로 트랜잭션 시작 // 중간 생략 ... connNew.commit(); // 새로운 트랜잭션 종료 connNew.close(); // 중간 생략 ... conn.commit(); conn.close(); 스프링은 새로운 트랜잭션을 새로 생성하는 것뿐만 아니라 기존 트랜..

Spring 2022.04.28

[Spring] 스프링 데이터베이스(4) - 트랜잭션

트랜잭션이란 인터넷 서점 사이트에서 도서를 구매할 경우 다음과 같은 순서로 작업이 진행될 것이다. 결제를 수행한다. 결재 내역을 저장한다. 구매 내역을 저장한다. 위의 과정은 도서 구매 시 반드시 모두 성공적으로 이루어져야 한다. 하나라도 실패할 경우 반드시 모든 과정이 취소되어야 한다. 예를 들어, 결제 내역 저장까지는 성공했는데, 구매 내역을 저장하는 과정이 실패했다고 하자. 이때, 전 과정이 취소되지 않는다면 구매자는 결제만 하고 구매는 하지 않는 것처럼 될 것이다. 트랜잭션은 여러 과정을 하나의 행위로 묶을 때 사용된다. 트랜잭션은 트랜잭션 범위 내에 있는 처리 과정 중 한 가지라도 실패할 경우 전체 과정을 취소시킴으로써 데이터의 무결성을 보장한다. 즉 트랜잭션은 모두 반영하거나 모두 반영하지 않..

Spring 2022.04.25

[Spring] 스프링 데이터베이스(3) - DataSource 설정

DataSource 설정 스프링은 다음과 같이 3가지 방식의 DataSource 설정을 지원하고 있다. 커넥션 풀을 이용한 DataSource 설정 JNDI를 이용한 DataSource 설정 DriverManager를 이용한 DataSourcr 설정 (테스트 목적) 커넥션 풀을 이용한 Data Source 설정 스프링은 c3p0와 같은 커넥션 풀 라이브러리를 이용해서 커넥션 풀을 지원하는 DataSoure를 설정할 수 있다. 이를 위해 먼저 다음과 같이 라이브러리를 추가해야 한다. org.springframework spring-context 4.0.4.RELEASE org.springframework spring-jdbc 4.0.4.RELEASE com.mchange c3p0 0.9.2.1 mysql ..

Spring 2022.04.19

[Spring] 스프링 데이터베이스(2) - 익셉션 처리

스프링 익셉션 처리 JDBC 프로그래밍을 할 때 데이터베이스 처리 과정에서 발생하는 에러는 항상 SQLException이다. 예를 들어 다음 코드를 보자. try { conn = getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from guestbook_message"); // 이하 생략 ... } catch (SQLException ex) { // 익셉션 처리 } 위 코드에서 SQLException을 캐치하는 코드는 Connection을 구하는 과정에서 익셉션이 발생했는지, Statement를 생성하는 과정에서 익셉션이 발생했는지, 아니면 SQL 쿼리를 실행하는 과정에서 익셉션이 발생했는지 바로 알 수 없다..

Spring 2022.04.18

[Spring] 스프링 데이터베이스(1) - 템플릿 클래스

스프링 데이터베이스 연동 스프링은 JDBC를 이용한 DAO 클래스를 구현할 수 있도록 다양한 기능을 지원하고 있는데, 그 내용은 다음과 같다. 템플릿 클래스를 통한 데이터 접근 지원 의미 있는 익셉션 타입 트랜잭션 처리 데이터베이스 연동을 위한 템플릿 클래스 데이터에 접근하는 코드는 거의 동일한 코드 구성을 갖는다. 예를 들어, JDBC를 사용할 경우 특정 테이블에서 데이터를 로딩하는 코드는 다음과 같은 구조를 갖는다. Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement("select * from message w..

Spring 2022.04.17

[Spring] 스프링 MVC(19) - 서블릿 3 기반 설정

서블릿 3 기반 설정 서블릿 3 버전부터 web.xml 파일을 사용하는 대신 자바 코드를 이용해서 서블릿 / 필터를 등록할 수 있게 되었다. 방법은 WebApplicationInitializer 인터페이스를 상속받아 알맞게 구현해주면 된다. 다음은 그 예이다. public class SpringServletConfig implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { XmlWebApplicationContext servletAppContext = new XmlWebApplicationContext(); servletAppCont..

Spring 2022.04.16

[Spring] 스프링 MVC(18) - @RequestBody, @ResponseBody, HttpMessageConverter

@RequestBody, @ResponseBody 브라우저와 웹 서버 간에 데이터를 주고받을 때 사용되는 HTTP 프로토콜은 다음 그림과 같이 헤더와 몸체로 구성되어 있다. 요청 몸체에는 브라우저가 전송한 데이터가 담기는데, 이 데이터의 형식은 Content-Type 헤더 값으로 지정한다. 위 그림의 경우 요청 몸체의 형식이 'multipart/form-data'라고 지정되어 있다. 응답도 동일하게 헤더와 몸체로 구성되며, Content-Type 헤더를 이용해서 몸체의 데이터 형식을 지정한다. @RequestBody 어노테이션은 요청 몸체를 자바 객체로 변환할 때 사용된다. 예를 들어 요청 파라미터 문자열을 String 자바 객체로 변환하거나, JSON 형식의 요청 몸체를 자바 객체로 변환할 때 @Req..

Spring 2022.04.15

[Spring] 스프링 MVC(17) - 핸들러, HandlerMapping, HandlerAdapter

핸들러, HandlerMapping, HandlerAdapter DispatcherServlet은 웹 요청을 실제로 처리하는 객체의 타입을 @Controller 어노테이션을 구현한 클래스로 제한하지 않는다. 실제로 거의 모든 종류의 객체로 웹 요청을 처리할 수 있다. 그래서 웹 요청을 처리하는 객체를 좀 더 범용적인 의미로 '핸들러(Handler)'라고 부른다. DispatcherServlet은 웹 요청 처리 결과로 ModelAndView만 리턴하면 올바르게 동작한다. 그런데 지금까지 작성한 컨트롤러는 ModelAndView 뿐만 아니라 String을 리턴한 경우도 있었다. 따라서 누군가는 중간에서 String 타입을 ModelAndView로 변경해주어야 하는데, 이때 사용되는 것이 바로 HandlerA..

Spring 2022.04.07

[Spring] 스프링 MVC(16) - DelegatingFilterProxy

DelegatingFilterProxy를 이용한 서블릿 필터 등록 DelegatingFilterProxy 클래스는 서블릿 필터를 스프링 빈으로 등록할 때 사용된다. DelegatingFilterProxy 클래스는 스프링 컨테이너에 빈으로 등록된 서블릿 필터에 필터 처리를 위임한다. DelegatingFilterProxy를 사용하기 위해서는 다음과 같이 web.xml 파일에 DelegatingFilterProxy를 서블릿 필터로 등록해주면 된다. profileFilter org.springframework.web.filter.DelegatingFilter targetBeanName webProfileBean contextAttribute org.springframework.web.servlet.Framew..

Spring 2022.04.06

[Spring] 스프링 MVC(15) - WebApplicationContext

WebApplicationContext 계층 DispatcherServlet은 그 자체가 서블릿이기 때문에 한 개 이상의 DispatcherServlet을 설정하는 것이 가능하다. 예를 들어 다음과 같이 웹 페이지를 위한 DispatcherServlet과 REST 기반의 웹 서비스 연동을 위한 DispatcherServlet을 나누어 설정했다고 하자. front org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/front.xml rest org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/rest.xml 위 설정에서 두..

Spring 2022.04.05