자바 ORM 표준 JPA 프로그래밍 - 웹 애플리케이션 제작(1)

Song Chae Won·2023년 8월 6일
0
post-thumbnail

📝 11장 웹 애플리케이션 제작

11.1 프로젝트 환경설정

진행 순서

  1. 프로젝트 구조 분석 : 프로젝트 폴더 구조를 분석
  2. 메이븐과 라이브러리 설정 : 메이븐에 사용할 라이브러리 지정
  3. 스프링 프레임워크 설정 : 스프링 프레임워크 환경 설정
    웹 서버를 실행하기 위해 메이븐의 톰켓 플러그인 사용

프로젝트 구조

메이븐이 제공하는 표준 프로젝트 구조를 사용

// 프로젝트 구조
jpashop (프로젝트 루트)
|- src (소스 폴더)
|   |- main (실행 코드
|   |   |- java (자바 소스 코드)
|   |   |- resources (리소스)
|   |   |- webapp (웹 폴더)
|   |_ test (테스트 코드)
|_ target (빌드 결과)
|_ pom.xml (메이븐 설정 파일)

11.1.2 메이븐과 사용 라이브러리 관리

메이븐 설정 파일인 pom.xml을 열어서 현재 프로젝트 정보와 사용할 라이브러리를 지정

<!-- pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- POM 모델 버전, 그대로 사용한다 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 라이브러리 간에 충돌을 피하려면 groupId + artifactId는 유일해야 함 -->
    <!-- 프로젝트 그룹명 -->
    <groupId>jpabook</groupId>
    <!-- 프로젝트를 식별하는 아이디 -->
    <artifactId>ch11-jpa-shop</artifactId>
    <!-- 프로젝트 버전 -->
    <version>1.0-SNAPSHOT</version>
    <!-- 프로젝트 이름 -->
    <name>jpa-shop</name>
    <!-- 빌드 패키징 방법을 지정. 웹 애플리케이션은 war, 자바 라이브러리는 jar 로 설정 -->
    <packaging>war</packaging>

    <!-- 사용할 라이브러리를 지정 -->
    <dependencies>
        ... 생략
    </dependencies>

    <!-- 빌드 관련 정보를 설정 -->
    <build>
        ... 생략
    </build>
</project>

- 사용할 라이브러리를 <dependencies>에 지정

groupId + artifactId + version만 적어주면 라이브러리를 메이븐 공식 저장소에서 자동으로 내려받아 라이브러리에 추가해 줌

핵심 라이브러리

  • 스프링 MVC (spring-webmvc): 스프링 MVC 라이브러리
  • 스프링 ORM (spring-orm): 스프링 프레임워크와 JPA를 연동하기 위한 라이브러리
  • JPA, 하이버네이트 (hibernate-entitymanager): JPA 표준과 하이버네이트를 포함하는 라이브러리이며 이를 지정하면
    다른 중요한 라이브러리도 함께 내려받음 (hibernate-core-[버전정보].jar, hibernate-jpa-2.1-api-[버전정보].jar)

기타 라이브러리

  • H2 데이터베이스 (h2): H2 데이터베이스는 아주 작은 데이터베이스이며 별도의 설치 없이 JVM 메모리 안에서 동작하는 기능을 통해 실습
  • 커넥션 풀 (tomcat-jdbc): tomcat-jdbc 커넥션 풀을 사용
  • WEB (jstl): 서블릿, JSP와 관련된 라이브러리
  • 로딩 SLF4J & LogBack (slf4j-api): 과거에는 Log4j가 많이 사용되었지만 최근에는 SLF4J와 LogBack이 많이 사용되며 성능과 기능이 많이 향상됨
  • 테스트 (spring-test): 테스트용 라이브러리
<!-- <dependencies> -->
    <!-- 사용할 라이브러리를 지정 -->
    <dependencies>

        <!-- 스프링 MVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

        <!-- 스프링 ORM -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

        <!-- JPA, 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2db.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- 커넥션 풀 -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>${tomcat-jdbc.version}</version>
            <scope>compile</scope>
        </dependency>

        <!-- WEB -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- 로깅 SLF4J & LogBack -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- 테스트 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-framework.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

정상 동작하는지 확인

  • package를 선택
  • 빌드 결과로 만들어진 war 파일 확인하기!

스프링 프레임워크 설정

웹 애플리케이션을 실행하기 위한 환경설정

  1. web.xml : 웹 애플리케이션 환경설정 파일
  2. webAppConfig.xml : 스프링 웹 관련 환경설정 파일
  3. appConfig.xml : 스프링 애플리케이션 관련 환경설정 파일
// 프로젝트 구조
jpashop
|___ src
    |___ main (실행 코드)
        |___ java (자바 소스코드)
        |     |___ jpabook 
        |           |___ jpashop 
        |                 |___ domain (도메인 계층)
        |                 |___ repository (데이터 저장 계층)
        |                 |___ service (서비스 계층)
        |                 |___ web (웹 계층)
        |___ resources (리소스)
        |    |___ appConfig.xml (스프링 애플리케이션 관련 설정)
        |    |___ webAppConfig.xml (스프링 웹 관련 설정)
        |___ webapp (웹 폴더)
             |___ WEB-INF
                  |___ web.xml (웹 애플리케이션 환경설정 파일)
                  
  • web.xml: 웹 애플리케이션에서 스프링 프레임워크를 구동하기 위한 설정이 대부분이며 appConfig.xml을 설정하는 부분과 webAppConfig.xml을 설정하는 부분으로 나누어 있으며 스프링 프레임워크를 설정할 때 보통 웹 계층과 비즈니스 도메인 계층을 나누어 관리함
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0" metadata-complete="true">

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- webAppConfig.xml : 스프링 MVC 설정을 포함해서 웹 계층을 담당 -->
        <param-value>classpath:appConfig.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- appConfig.xml : 비즈니스 로직, 도메인 계층, 서비스 계층, 데이터 저장 계층을 담당 -->
            <param-value>classpath:webAppConfig.xml, classpath:appConfig.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

🔻 webAppConfig.xml

  • JSP, JSTL을 사용하도록 뷰 리졸버를 스프링 빈을 등록
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 스프링 MVC 기능을 활성화 -->
    <mvc:annotation-driven/>
    <!--<context:annotation-config />-->
    <!-- basePackages 를 포함한 하위 패키지를 검색해서
         @Component, @Service, @Repository, @Controller
         어노테이션이 붙어 있는 클래스들을 스프링 빈으로 자동 등록한다.
         여기서는 웹과 관련된 jpabook, jpashop.web 패키지를 검색해서 스프링 빈으로 등록
         이 패키지에는 컨트롤러가 있음 -->
    <context:component-scan base-package="jpabook.jpashop.web"/>

    <!-- 스프링 빈을 등록 (JSP, JSTL을 사용하도록 뷰 리졸버를 스프링 빈을 등록) -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <mvc:default-servlet-handler/>

    <mvc:interceptors>
        <bean class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>
    </mvc:interceptors>

</beans>

🔻 appConfig.xml: jpaProperties를 사용해서 하이버네이트 구현체의 속성을 설정할 수 있음

  • hibernate.dialect : 사용할 데이터베이스 방언을 설정
  • hibernate.show_sql : 실행하는 SQL을 콘솔에 출력
  • hibernate.format_sql : SQL을 보기 좋게 정리해서 출력
  • hibernate.use_sql_comments : SQL을 출력할 때 어떻게 실행된 SQL인지 또는 사용자가 설정한 코멘트를 남김
  • hibernate.id.new_generator_mappings : JPA에 맞춘 새로운 ID 생성 방법을 사용
  • hibernate.hbm2ddl.auto : 애플리케이션이 시작될 때 테이블과 기타 DDL을 자동으로 생성
  • create : 기존 DDL을 제거하고 새로 생성
  • create-drop : create와 같은데 애플리케이션을 종료할 때 생성한 DDL을 제거
  • update : 현재 데이터베이스 DDL과 비교해서 변경사항만 수정
  • validate : 현재 엔티티 매핑 정보와 데이터베이스 스키마가 같은지 비교한 후 만약 다르다면 경고만 남김

👩‍💻 빌드 관리 도구 Maven VS Gradle

빌드 도구란 소스코드에서 애플리케이션을 생성하면서 여러가지 외부 라이브러리를 사용하는데, 빌드 관리 도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다.

빌드 관리 도구 작업 수행 순서

(1) 종속성 다운로드 - 전처리(Preprocessing)
(2) 소스코드를 바이너리 코드로 컴파일(Compile)
(3) 바이너리 코드를 패키징(Packaging)
(4) 테스트 실행(Testing)
(5) 프로덕션 시스템에 배포(distribution)

Gradle

  • Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며, Ant Builder와 Groovy script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용된다. 빌드 속도가 Maven에 비해 10~100배 가량 빠르며, Java, C/C++, Python 등을 지원한다.

📌 Gradle의 특징 및 장점

  • 가독성이 좋다 : 코딩에 의한 간결한 정의가 가능하므로 가독성이 좋다.
  • 재사용에 용이 : 설정 주입 방식(Configuration Injection)을 사용하므로 재사용에 용이하다.
  • 구조적인 장점 : Build Script를 Groovy 기반의 DSL(Domail Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
  • 편리함 : Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원한다.
  • 멀티 프로젝트 : Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
  • 지원: Maven을 완전 지원한다.
  • 속도: gradle은 캐시를 사용하므로 테스트 반복 시 실행 결과 시간의 차이가 더 커짐
profile
@chhaewxn

0개의 댓글