애플리케이션 설계 및 구현

0taetae·2025년 1월 17일
post-thumbnail

📙프로젝트 구조

src/main/java

  • domain(도메인 계층)
    • 비즈니스 도메인 모델을 정의
    • JPA 엔티티 클래스가 있음
  • repository(데이터 저장 계층) ✔️DAO와 유사한 역할
    • 데이터베이스와의 상호작용
    • Spring Data JPA를 사용하여 레포지토리 인터페이스를 정의
  • service(서비스 계층)
    • 비즈니스 로직을 구현
    • 트랜잭션 관리
    • 레포지토리 계층을 사용하여 데이터를 조장
  • web(웹 계층)
    • HTTP 요청을 처리하고 응답을 반환
    • Spring MVC의 컨트롤러가 있음
    • RESTful API를 구현

src/main/resources

  • appConfig.xml : 스프링 애플리케이션 관련 설정(비즈니스 로직, 도메인 계층, 서비스 계층, 데이터 저장 계층 담당)
    • <tx:annotation-driven/> : 스프링 프레임워크가 제공하는 어노테이션 기반 트랜잭션 관리자를 활성화, @Transactional한 곳에 트랜잭션을 적용
    • 데이터 소스 설정
      <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
        <property name="driverClassName" value="org.h2.Driver"/> // driverClassName -> H2 데이터베이스 드라이버를 지정 
        <property name="url" value="jdbc:h2:mem:jpashop"/> 
        // url -> 메모리 내 H2 데이터베이스에 연결하는 JDBC URL을 설정 
           jdbc:h2 -> H2 데이터베이스를 사용하는 JDBC 연결, 
           mem -> 인메모리 모드로 데이터베이스를 실행
           jpashop -> 데이터베이스의 이름 지정 
        <property name="username" value=""/> // DB 접속 정보를 설정
        <property name="password" value=""/> // DB 접속 정보를 설정
      </bean>
      💡Spring Boot를 사용할 경우 아래와 같이 대체된다.
      // application.properties
      // 데이터 소스 설정
      spring.datasource.driver-class-name=org.h2.Driver
      spring.datasource.url=jdbc:h2:mem:jpashop
      spring.datasource.username=
      spring.datasource.password=
      // JPA 설정 
      spring.jpa.hibernate.ddl-auto=create
      spring.jpa.show-sql=true
      spring.jpa.properties.hibernate.format_sql=true
      spring.jpa.properties.hibernate.use_sql_comments=true
    • 트랜잭션 관리자 설정
      <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  // JPA를 사용할 때 
        <property name="dataSourc" ref="dataSource"/>
      </bean>
    • 엔티티 매니저 팩토리 등록
      <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> // LocalContainerEntityManagerFactoryBean -> JPA를 스프링 컨테이너에서 사용할 수 있도록 spring framework가 제공하는 기능 
        <property name="dataSource" ref="dataSource"/> // 사용할 데이터소스를 등록
        <property name="packagesToScan" value="jpabook.jpashop.domain"/> // @Entity 탐색 시작 위치 지정
        <property name="jpaVendorAdapter"> // 사용할 JPA 벤더를 지정 
            <!-- 하이버네이트 구현체 사용 -->
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties"> <!-- 하이버네이트 상세 설정 -->
           <props>
             <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> // 사용할 데이터베이스 방언을 지정  
             <prop key="hibernate.show_sql">true</prop>                   // 실행하는 SQL을 콘솔에 출력 
             <prop key="hibernate.format_sql">true</prop>                 // SQL 정렬해서 보기 
             <prop key="hibernate.use_sql_comments">true</prop>           // SQL 코멘트 보기 
             <prop key="hibernate.id.new_generator_mappings">true</prop>  // 새 버전의 ID 생성 옵션 
             <prop key="hibernate.hbm2ddl.auto">create</prop>             // DDL 자동 생성 -> 옵션 : create, create-drop, update, validate 
                                                                          // create : 기존 DDL을 제거하고 새로 생성
                                                                          // create-drop : 애플리케이션을 종료할 때 생성한 DDL을 제거
                                                                          // update : 현재 데이터베이스 DDL과 비교해서 변경사항만 수정
                                                                          // validate : 현재 엔티티 매핑 정보와 데이터베이스 스키마가 같은지 비교한다. 다를 경우, 경고를 남기고 애플리케이션을 실행하지 않는다. 
         </props>
       </property>
      </bean>
  • webAppConfig.xml : 스프링 웹 관련 설정(스프링 MVC 설정 등)
    • <mvc:annotation-driven> : 스프링 MVC 기능을 활성화
    • <context:component-scan> : 하위 패키지(basePackages 등)를 검색해서 @Component, @Service, @Repository, @Controller이 붙어있는 클래스들을 스프링 bean으로 자동 등록
      💡Spring Boot를 사용할 경우 필요하지 않다.

src/main/webapp

  • WEB-INF
    • web.xml : 웹 애플리케이션 환경설정

📙도메인 모델과 테이블 설계

1. 요구사항 분석

2. 도메인 모델 설계

3. 테이블 설계

4. 연관관계 정리

5. 엔티티 클래스

📙애플리케이션 구현

일반적으로 계층형 구조를 사용한다.
앞서 프로젝트 구조에서 살펴보았지만, 다시 한번 정리해보자.

  1. Controller
    • MVC의 컨트롤러가 모여 있는 곳이다.
    • 서비스 계층을 호출하고 결과를 뷰에 전달한다.
    • 관련 어노테이션
      • @RequestMapping
  2. Service
    • 비즈니스 로직이 있고, 트랜잭션을 시작한다.
    • 데이터 접근 계층인 레포지토리를 호출한다.
    • 관련 어노테이션
      • @Service : <context:component-scan>에 의해 스프링 빈으로 자동 등록
      • @Transactional : 이 어노테이션이 붙어 있는 클래스나 메소드에 트랜잭션을 적용
      • @Autowired : 스프링 컨테이너가 적절한 스프링 빈을 주입
  3. Repository
    • JPA를 직접 사용하는 곳이다.
    • 엔티티 매니저를 사용해서 엔티티를 저장하고 조회한다.
    • 관련 어노테이션
      • @Repository : <context:component-scan>에 의해 스프링 빈으로 자동 등록
      • @PersistenceContext : 컨테이너가 관리하는 엔티티 매니저를 주입
      • @PersistenceUnit : 엔티티 매니저 팩토리를 주입
  4. Domain
    • 엔티티가 모여 있는 계층이다.
    • 모든 계층에서 사용한다.

0개의 댓글