웹 애플리케이션 만들기 진행 순서
- 프로젝트 환경설정
- 도메인 모델과 테이블 설계
- 애플리케이션 기능 구현
프로젝트 환경설정
프로젝트 구조
메이븐과 사용 라이브러리 관리
- pom.xml 분석
라이브러리 간에 충돌을 피하려면 groupId + artifactId는 유일해야 한다.
<dependencies> 에는 사용할 라이브러리를 지정한다. groupId + artifactId + version만 적어주면 메이븐 저장소에서 자동으로 내려받아 라이브러리에 추가해준다. 핵심 라이브러리는 다음 3가지 이다.
- 스프링MVC : 스프링 MVC 라이브러리
- 스프링ORM : 스프링 프레임워크와 JPA를 연동하기 위한 라이브러리
- JPA, 하이버네이트 : JPA 표준과 하이버네이트를 포함하는 라이브러리
기타 라이브러리
- H2 DB
- 커넥션 풀 : tomcat-jdbc 커넥션 풀을 사용한다.
- WEB : 서블릿, JSP와 관련된 라이브러리
- 로깅 SLF4J & LogBack : 최근은 이것을 많이 사용 -> 성능, 기능 향상
- 테스트 : 테스트용 라이브러리
이클립스 메뉴에서 Run > Run As > Maven Build ... 그리고 Goals에 package라고 입력하고 Run 버튼 클릭
target 폴더에 가보면 결과로 jpashop.war 파일이 생성되어 있다.
라이브러리 설정, 빌드도 성공했다 다음으로 스프링 프레임워크와 JPA를 실행하기 위한 설정을 진행해보자.
스프링 프레임워크 설정
- web.xml : 웹 애플리케이션 환경설정 파일
- webAppConfig.xml : 스프링 웹 관련 환경설정 파일
- appConfig.xml : 스프링 애플리케이션 관련 환경설정 파일
- webAppConfig.xml : 스프링 MVC 설정을 포함해서 웹 계층을 담당한다.
- appConfig.xml : 비즈니스 로직, 도메인 계층, 서비스 계층, 데이터 저장 계층을 담당한다.
- <mvc:annotation-driven> : 스프링 MVC 기능 활성화
- <context :component-scan> : basePackages를 포함한 하위 패키지를 검색해서 @Component, @Service, @Repository, @Controller 어노테이션이 붙어 있는 클래스들을 스프링 빈으로 자동 등록한다. 이 패키지에는 컨트롤러가 있다.
- <bean> : 스프링 빈을 등록한다. JSP, JSTL을 사용하도록 뷰 리졸버를 스프링 빈을 등록했다.
밑에서 순서대로 분석해보자.
- <tx:annotation-dricen/> : 스프링 프레임워크가 제공하는 어노테이션 기반의 트랜잭션 관리자를 활성화한다. 이 기능은 @Transactional이 붙은 곳에 트랜잭션을 적용한다.
위 데이터소스 는 데이터베이스에 접근할 데이터소스를 등록한다 .여기서는 H2 DB의 접속 URL을 jdbc:j2:mem:...으로 설정해서 JVM안에서 동작하는 인 메모리 DB로 사용한다.이제 애플리케이션을 시작할 때 DB도 애플리케이션 안에서 함께 실행되고 애플리케이션을 종료할때도 DB도 함께 사라진다.
만약 서버 모드로 접근하려면 url 속성을 다음처럼 변경하면 된다.
jdbc:j2:tcp://localhost/~/jpashop:MVCC=TRUE
JPA를 사용하려면 위에 것을 트랜잭션 관리자로 등록해야 한다. 이 트랜잭션 관리자는 DataSourceTransactionManager가 하던 역할도 수행하므로 JPA뿐만 아니라 JdbcTemplate, MyBatis와 함께 사용 가능하다.
PersistenceExceptionTranslationPostProcessor는 @Repository 어노테이션이 붙어 있는 스프링 빈에 예외 변환 AOP를 적용한다. 이 AOP는 JPA 예외를 스프링 프레임워크가 추상화한 예외로 변환해준다.
스프링 프레임워크에서 JPA를 활용하려면 위와 같이 스프링 프레임워크가 제공하는 LocalContainerEntityManagerFactoryBean을 스프링 빈으로 등록해야 한다. 순수하게 자바만 사용하는 J2SE환경에서는 persistence.xml에 엔티티 매니저 팩토리 정보를 설정하지만 스프링에서 JPA 를 사용하려면 저렇게 등록해야 엔티티 매니저 팩토리를 등록할 수 있다. 여기서 설정을 다 하기 때문에 persistence.xml이 없어도 동작한다.
- LocalContainerEntityManagerFactoryBean : JPA를 스프링 컨테이너에서 사용할 수 있도록 스프링 프레임워크가 제공하는 기능이다.
- dataSource : 사용할 데이터소스를 등록한다.
- packagesToScan : @Entity가 붙은 클래스를 자동으로 검색하기 위한 시작점을 지정한다.
- persistenceUnitName : 영속성 유닛 이름을 지정한다. 위처럼 지정하지 않으면 default라는 이름의 영속성 유닛을 생성
- jpaVendorAdapter : 사용할 JPA 벤더를 지정한다. 여기서는 하이버네이트를 구현체로 사용한다.
- 하이버네이트 속성 설정
- hibernate.dialect: 사용할 DB 방언을 설정한다. 여기서는 H2 DB 방언을 지정했다.
- hibernate.show_sql: 실행하는 SQL을 콘솔에 출력한다.
- hibernate.format_sql : SQL을 보기 좋게 정리해서 출력한다.
- hibernate.use_sql_comments: SQL을 출력할 때 어떻게 실행된 SQL인지 또는 사용자가 설정한 코멘트를 남긴다.
- hibernate.id.new_generator_mappings: JPA에 맞춘 새로운 ID 생성 방법을 사용한다. 하이버네이트 레거시를 운영하는 것이 아니면 항상 true로 설정해야 한다.
- hibernate.hbm2ddl.auto : 애플리케이션이 시작될 때 테이블과 기타 DDL을 자동으로 생성한다.
- create : 기존 DDL을 제거하고 새로 생성한다.
- create-drop : create와 같은데 애플리케이션을 종료할 때 생성한 DDL을 제거한다.
- update : 현재 DB DDL과 비교해서 변경사항만 수정한다.
- validate : 현재 엔티티 매핑 정보와 DB 스키마가 같은지 비교하고 만약 다르면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정은 DDL을 변경하지 않는다.
'Spring > JPA' 카테고리의 다른 글
웹 애플리케이션 제작(애플리케이션 구현) (0) | 2023.07.17 |
---|---|
웹 애플리케이션 제작(도메인 모델과 테이블 설계) (0) | 2023.07.17 |
객체지향 쿼리 언어(4) 네이티브 SQL (0) | 2023.07.17 |
객체지향 쿼리 언어(3) QueryDSL (0) | 2023.07.17 |
객체지향 쿼리 언어(2) Criteria (0) | 2023.07.17 |