728x90

MyBatis → JPA

  • MyBatis : SQL 실행결과를 자바객체에 매핑시켜주는 것
  • JPA(Java Persistence API)
    • Java Persistence API(자바 ORM 기술에 대한 API 표준 명세)
    • 한마디로 ORM을 사용하기 위한 인터페이스를 모아둔 것
    • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • ORM에 대한 자바 API 규격이며 Hibernate, OpenJPA 등이 JPA를 구현한 구현체이다. (ORM을 사용하기 위한 인터페이스를 모아둔 것)
    • Hibernate 이외에도 EcipseLink, DataNucleus, OpenJPA, TopLink 등이 있음
    • JPA는 결국 인터페이스이기 때문에 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 함

JPA를 왜 사용할까?

Mybatis에 익숙해져서 잊어버렸을 수 있지만, 신규 개발시 또는 신규 컬럼이 추가되어 작업을 할 때 등 CRUD SQL을 계속 반복적으로 사용함.

신규 컬럼 하나만 추가되더라도 DTO(VO, Domain 등), DAO 개발, 수정 작업이 매우 반복되는 작업이다.

ORM(Object-Relational Mapping)의 장점

  • 생산성 : 매핑을 하면 데이터 입출력이 정말 쉬워진다.
  • 유지보수성 : 코드가 굉장히 간결해지고, 코드량이 줄어 유지보수성이 높아진다.
  • 성능 : 객체와 테이블 사이에 캐시가 존재하여 중복 혹은 필요없는 데이터 변경 요청이 들어오면 반영하지 않고, 데이터가 변경될 여지가 있을 때만 변경 함으로 효율적이다.
  • 벤더 독립성 : Hibernate가 어떠한 데이터베이스에 맞게 SQL을 자동으로 생성함을오 DBMS에 독립적이다.

ORM의 단점

  • 높은 학습비용 : SQL, Hibernate, JPA 전부 잘 알고 있어야 제대로 활용할 수 있기에 학습하는데 높은 난이도와 많은 시간이 소요된다.
  • 특정 데이터베이스 기능을 사용할 수 없다.(오라클 함수, 튜닝기능)
  • 객체지향 설계가 필요하다.

- pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jap</artifactId>
</dependency>
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <scope>runtime</scope>
</dependency>

 

- application.yml

spring:
  datasource:
    url: jdbc:mariadb://localhost:3306/dbname
    driver-class-name: org.mariadb.jdbc.Driver
    username: root
    password: 1234
  jpa:
    open-in-view: false
    generate-ddl: true
    show-sql: true
    hibernate:
      ddl-auto: update

 

- BoardVO.java

@Entity
@Table(name = "board")
@Getter
@Setter
public class BoareEntity implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long boardId;

    @Column(length = 100)
    private String title;

    @Column(length = 4000)
    private String contents;

 

- BoareRepository.java

public interface BoardRepository extends JpaRepository<BoardVO, Long>{}

 

- BoardService.java

@Service
public class BoardService{
    @Autowired
    private BoardRepository boardRepository;

    public BoardVO getBoard(Long boardId){
        return boardRepository.findById(boardId).orElseThrow(() -> new RestException(HttpStatus.NOT_FOUND, "Not found board"));
    }
}

 

JSP → Thymeleaf

  • JSP : 서블릿이라는 형태로 변환되어 실행이 된다. 서블릿이 자바소스이다보니 JSP내에서도 자바코드를 사용할 수 있게 된다.
  • Thymeleaf : HTML, XML, JS, CSS 등을 처리할 수 있는 웹 및 독립형 환경에서 사용이 가능한 JAVA 템플릿 엔진이다. HTML 파일을 가져와서 파싱하고 그걸 분석하여 정해진 위치에 데이터를 뿌려준다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
	<title>Test</title>
</head>
<body>
	<p th:text="'Hi!, ' + ${data}">Hi!, banker </p>
</body>
</html>

 

tiles 사용

타일즈는 웹 페이지의 상단이나 하단 메뉴와 같이 반복적으로 사용되는 부분들에 대한 코드를 분리해서 예쁘게 한 곳에서 관리를 가능하게 해주는 프레임워크이다.

JSP include와의 차이

비슷한 역할이지만, tiles가 여러모로 편리하고 좋다. jsp는 페이지 내에 동일한 레이아웃 정보가 들어가므로 전체적인 레이아웃을 변경하게 될 경우 모든 페이지를 수정해야하는 문제점이 있다. 예를들면 만약 50개의 페이지에 상단 메뉴가 include 되어있는데, 페이지명이 바뀌면 50개 파일을 전부 수정해주어야 하는 것이다. tiles는 이런 일이 있으면 설정파일만 변경해주면 된다.

특징

화면 기본 구성 레이아웃 템플릿 정의하고 상속을 통하여 대부분 구조를 재사용할 수 있는 기능 및 설정파일을 통한 통합 관리를 통하여 확장성 있고 일관되게 페이지 구성을 관리한다.

 

출처: https://sjh836.tistory.com/133 [빨간색코딩]

 

- pom.xml

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.7</version>
</dependency>
- TilesConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

@Configuration
public class TilesConfig{
    @Bean
    public TilesConfigurer tilesConfigurer(){
        final TilesConfigurer configurer = new TilesConfigurer();

        //해당 경로에 tiles.xml 파일을 넣음
        configurer.setDefinitions(new String[]{"/WEB-INF/tiles/tiles.xml"});
        configurer.setCheckRefresh(true);
        return configurer;
    }

    @Bean
    public TilesViewResolver tilesViewResolver(){
        final TilesViewResolver tilesViewResolver = new TilesViewRewolver();
        tilesViewResolver.setViewClass(TilesView.class);
        return tilesViewResolver;
    }
}
- tiles.xml
<?xml version"1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

  <!-- main -->
	<definition name="main-layout" template="/WEB-INF/views/main/layout/base-min.jsp">
    <put-attribute name="header" value="/WEB-INF/views/common/layout/header.jsp" />
    <put-attribute name="body" value="" />
    <put-attribute name="footer" value="/WEB-INF/views/common/layout/footer.jsp" />
  </definition>

  <definition name="main/*" extends="main-layout">
    <put-attribute name="body" value="/WEB-INF/views/main/body/{1}.jsp" />
  </definition>

  <definition name="main/*/*" extends="main-layout">
    <put-attribute name="body" value="/WEB-INF/views/main/body/{1}/{2}.jsp" />
  </definition>

  <definition name="main/*/*/*" extends="main-layout">
    <put-attribute name="body" value="/WEB-INF/views/main/body/{1}/{2}/{3}.jsp" />
	 </definition>

</tiles-definitions>

- base-main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8">
    <title>ㅎㅎㅎㅎ</title>
    <!--<meta name="viewport" content="width=device-width, initial-scale=1.0">-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
  </head>
   <body>
    <section class="content">
      <tiles:insertAttribute name="header"/> <!--  /WEB-INF/views/common/layout/header.jsp -->
      <tiles:insertAttribute name="body"/> <!-- body -->

      <tiles:insertAttribute name="footer"/> <!-- /WEB-INF/views/common/layout/footer.jsp -->
    </section>
  </body>
</html>
728x90

+ Recent posts