스프링의 역사와 스프링 부트

 

스프링은 자바 언어를 효율적으로 개발할 수 있는 프레임워크입니다. 스프링을 학습하기 전에 스프링의 탄생 배경과 스프링 부트의 탄생 배경에 대해 간단하게 알아봅시다.

 

EJB(Enterprise Java Beans)와 스프링을 탄생시킨 EJB의 단점

 

스프링의 탄생을 이해하기 위해서는 스프링의 탄생 배경을 제공한 EJB가 무엇이고 어떤 단점을 갖고 있었는가 알아야 합니다. EJB는 기업 환경의 시스템을 구현하기 위한 서버 측 컴포넌트 모델입니다. 일반적으로 업무 로직을 가지고 있는 서버 어플레케이션을 말하는데 이는 독립적인 부품이 아닌, 미국 Sun Microsystems사 제창한 규약으로 EJB는 서버 어플리케이션의 개발을 용이하게 해 다양한 Platform과 제품 간의 이동성을 실현하기 위해 비즈니스 로직과 시스템 서비스를 이용하는 로직을 분산하여 그 사이의 규약을 규정합니다.

 

EJB는 트랜잭션을 자동으로 처리하여 안정적인 데이터 조작하고, 객체를 미리 생성하여 메모리에 저장하여 사용 준비 상태에 들어가도록 함으로써 많은 동시 접속자에 대한 안정성을 지원하는 등의 장점을 지니고 있지만 아래와 같은 단점을 갖고 있습니다.

 

* 객체 지향적이지 않다.

* 프로그래밍 모델이 복잡하다.

* 특정 환경, 기술에 코드가 종속적이다.

* 컨테이너 환경 안에서만 동작할 수 있는 객체 구조를 지녔다.

* 자동화된 테스트가 매우 어렵거나 불가능하다.

* 개발 생산성과 이동성이 부족한다.

 

위와 같은 문제점은 자바의 기본인 객체 지향을 무너뜨렸고, 스프링의 개발로 이어집니다.

 

로드 존스의 J2EE 설계와 개발

프링의 시작

 

스프링은 2002년, 개발자 로드 존슨(Rod Johnson)의 책 'J2EE 설계와 개발' 에서 시작되었습니다. 로드 존슨은 EJB에 의존적이었던 개발 환경이 못마땅했고 EJB에 의존하지 않은 효율적인 코드 30000줄 이상을 책을 통해 제시했는데 이 코드를 읽은 개발자 유겐 휠러얀 카로프는 로드 존슨에게 해당 코드를 이용한 오픈 소스 프로젝트를 제안하였습니다. 이렇게 2002년 로드 존슨의 책에서 시작되어 2004년에 탄생한 것이 Spring Framework입니다. Spring은 EJB에 의존적이었던 겨울이 끝나고 봄(Spring)이 왔다는 의미에서 붙여졌습니다.

 

 

스프링의 역사

 

스프링 프레임워크는 아래처럼 변화했습니다.

 

2003년 : 스프링 프레임워크 1.0 공개

2006년 : 스프링 프레임워크 2.0 공개 - XML 편의 기능을 지원

2009년 : 스프링 프레임워크 3.0 공개 - 자바 코드를 통한 설정 지원

2013년 : 스프링 4.0 - Java8

2014년 : 스프링 부트 1.0 공개

2017년 : 스프링 프레임워크 5.0, 스프링 부트 2.0 공개

 

2014년에는 스프링 부트가 공개되었는데 스프링과 스프링 부트의 차이점은 무엇일까요?

 

 

 

스프링 부트(Spring Boot)

 

스프링은 설정이 반이라는 말이 있을 정도로 개발 전에 스프링에서 해줘야 할 초기 설정들이 많습니다. 이러한 초기 설정을 간편하게 해주기 위해 등장한 것이 스프링 부트인데 스프링 부트는 스프링과 다르게 Tomcat과 같은 웹 서버를 내장하여 별도의 웹 서버를 설치하지 않아도 되고 스프링과 외부 라이브러리를 자동으로 구성합니다. 물론, 스프링 부트는 스프링과 다른 프레임워크가 아닌 스프링 위에서 돌아가는, 개발자의 편의를 위해 개발된 도구라고 보시면 됩니다.

 

 

스프링의 핵심

 

스프링이 자바 기반의 프레임워크라는 것을 알고 기반이 되는 언어인 자바가 객체 지향 언어라는 것에 중점을 둬야 합니다. 스프링은 자바가 가진 객체 지향의 특징을 살려낸 프레임워크이며 좋은 객체 지향 어플리케이션을 개발할 수 있도록 도와주는 도구라는 것입니다.

Servlet 한글(UTF-8) 인코딩 설정

 

서블릿에서 PrintWriter와 같은 클래스을 통해 한글을 입력하여 jsp 파일로 내보내는 경우, 그리고 폼 태그에서 입력한 값이 서블릿으로 넘어올 경우에 인코딩 설정이 되어 있지 않으면 한글이 정상적으로 출력되지 않습니다. 아래와 같이 서블릿의 메소드 시작 부분에 인코딩 설정을 해주면 정상적으로 출력됩니다.

 

response.setContentType("text/html; charset=utf-8");

response.setCharacterEncoding("utf-8");

request.setCharacterEncoding("utf-8");

 

@WebServlet("/UserHomeMain")
public class UserHomeMain extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public UserHomeMain() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        	// 넘어온 파라미터의 인코딩 설정을 UTF-8로 설정
        	request.setCharacterEncoding("utf-8");
        
        	// HTML이 UTF-8 형식이라는 것을 브라우저에게 전달
        	response.setContentType("text/html; charset=utf-8");
        
        	// 서블릿을 통해 생성되는 HTML 파일의 인코딩을 UTF-8로 설정
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		
		out.println("<script>");
		out.println("alert('성공');");
		out.println("</script>");
		
		RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
		rd.forward(request, response);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

JPA

JPA는 Java Persistence API의 약자로 자바 영속성 API라는 의미를 가지고 있다.

JPA 특징

1) 데이터를 객체 지향적으로 관리할 수 있어 개발자가 비즈니스 로직에 집중할 수 있다.

2) 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.

3) 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원한다.

4) JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇 가지 기법을 제공하는데 이것을 잘 활용할 경우 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.

엔티티(Entity)

JPA 사용을 위한 Entity 객체

 

JPA가 자동으로 생성한 user 테이블

JPA에서 Entity는 데이터베이스와 통신하기 위한 객체로 필요에 따라서는 JPA 스스로 Entity에 맞는 테이블을 생성할 수도 있다.

레포지토리(Repository)

JPA의 강점은 myBatis처럼 일일이 Mapper와 Mapper 내의 SQL문을 정의하지 않고도 데이터베이스에 접근 가능하도록 메소드를 제공한다는 것이다. JpaRepository를 상속받은 인터페이스는 데이터베이스에 접근하여 기본적이 CRUD 기능을 수행할 수 있다. 다음은 JpaRepository에서 제공하는 몇 가지 메소드와 그에 따른 기능이다.

 method  기능
 save()  레코드 저장 (insert, update)
 findOne()  primary key로 레코드 한건 찾기
 findAll()  전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능
 count()  레코드 갯수
 delete()  레코드 삭제

Query Method를 통해 필요로 하는 조회 및 삭제, 수정 등이 가능하다.

JPA에서 기본적으로 CRUD 기능을 제공하고 있지만 필요에 따라서 쿼리 메소드를 생성하여 필요에 맞게 데이터를 조회하거나 삭제, 수정을 할 수 있다는 강점이 있다. 물론 myBatis와 다르게 일일이 SQL을 정의하지 않아도 JPA 규칙에 따라 메소드 생성을 하면 메소드 이름에 맞게 쿼리문을 수행한다.

JPA VS myBatis

대한민국을 기준으로 한 JPA와 myBatis 검색량 비교

구글 트렌드에서 검색한 myBatis와 JPA의 조회량을 비교하면 국내에서는 지난 10년간 myBatis가 압도적이었으나 최근에는 비슷한 양상을 보이고 있다.

전세계를 기준으로 한 JPA와 myBatis 비교

하지만 전세계적으로 봤을 때 myBatis가 JPA를 앞선 적은 한 번도 없다. 한국에서는 긴 시간 myBatis를 사용하였기 때문에 유지 보수를 위해서라도 myBatis에 대한 학습이 어느 정도 필요할 지도 모르지만 앞으로는 개발자가 SQL보다 비즈니스 로직에 더 집중할 수 있는 환경을 제공하는 JPA가 국내에서도 myBatis를 앞지를 것으로 예상된다.

Entity

: JPA에서 테이블을 자동으로 생성해주는 기능을 한다.

- 어노테이션

@Entity : 해당 클래스가 Entity임을 명시한다.

@Table : 데이터베이스 테이블의 이름을 명시한다.

@Id : Primary Key임을 명시한다.

@Column : 데이터베이스의 이름을 명시한다.

@GeneratedValue : Primary Key의 자동 생성 전략을 설정한다.

 

Repository

: 쿼리문을 작성하지 않아도 기본적인 CRUD 기능을 사용할 수 있다.

CREATE : 생성

READ : 읽기

UPDATE : 수정

DELETE : 삭제

 

- 어노테이션

@Repository : 해당 인터페이스가 Repository임을 명시한다.

+ Recent posts