반응형

전자정부 프레임워크를 사용한 개발 과정에서 서비스 계층(Service Layer) 은 비즈니스 로직을 처리하고 데이터 접근 계층(DAO)과의 인터페이스 역할을 합니다. 이번 포스팅에서는 서비스 계층을 설계하고 구현하는 방법을 단계별로 설명합니다.


1. 서비스 계층의 역할

서비스 계층은 애플리케이션의 핵심 비즈니스 로직을 캡슐화하고, 컨트롤러와 DAO 간의 연결을 제공합니다. 주요 기능은 다음과 같습니다.

  • 비즈니스 로직 관리: 도메인 간 상호작용 처리.
  • 데이터 유효성 검사: 컨트롤러에서 넘어온 데이터를 검증.
  • 트랜잭션 관리: 데이터 일관성을 보장.

2. 구현 환경 설정

1) 프로젝트 구조
전자정부 프레임워크의 기본 디렉토리 구조는 다음과 같습니다.

src/main/java/com/example/service/
  - UserService.java
  - UserServiceImpl.java
src/main/java/com/example/dao/
  - UserDAO.java
  - UserDAOImpl.java
src/main/java/com/example/domain/
  - UserVO.java

2) 의존성 추가 pom.xml 또는 build.gradle 파일에 필요한 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.12</version>
</dependency>

3. 서비스 인터페이스 정의

비즈니스 로직을 처리하는 서비스 인터페이스를 정의합니다.

UserService.java

package com.example.service;

import com.example.domain.UserVO;
import java.util.List;

public interface UserService {
    UserVO getUserById(String userId);
    List<UserVO> getAllUsers();
    boolean createUser(UserVO user);
    boolean updateUser(UserVO user);
    boolean deleteUser(String userId);
}

4. 서비스 구현 클래스 작성

서비스 계층의 구체적인 구현을 작성합니다.

UserServiceImpl.java

package com.example.service;

import com.example.dao.UserDAO;
import com.example.domain.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDAO userDAO;

    @Override
    public UserVO getUserById(String userId) {
        return userDAO.findUserById(userId);
    }

    @Override
    public List<UserVO> getAllUsers() {
        return userDAO.findAllUsers();
    }

    @Override
    public boolean createUser(UserVO user) {
        return userDAO.insertUser(user) > 0;
    }

    @Override
    public boolean updateUser(UserVO user) {
        return userDAO.updateUser(user) > 0;
    }

    @Override
    public boolean deleteUser(String userId) {
        return userDAO.deleteUser(userId) > 0;
    }
}

5. 트랜잭션 관리 설정

전자정부 프레임워크는 스프링의 트랜잭션 관리를 활용합니다.

applicationContext.xml

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

서비스 메소드에 @Transactional 추가

import org.springframework.transaction.annotation.Transactional;

@Service
public class UserServiceImpl implements UserService {

    @Transactional
    public boolean createUser(UserVO user) {
        return userDAO.insertUser(user) > 0;
    }

    @Transactional(readOnly = true)
    public UserVO getUserById(String userId) {
        return userDAO.findUserById(userId);
    }
}

6. 테스트 케이스 작성

서비스 계층의 메소드를 단위 테스트로 검증합니다.

UserServiceTest.java

package com.example.service;

import com.example.domain.UserVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testGetUserById() {
        UserVO user = userService.getUserById("testUser");
        assertEquals("testUser", user.getUserId());
    }
}

결론

서비스 계층은 애플리케이션의 안정성과 확장성을 보장하는 중요한 구성 요소입니다. 이번 포스팅에서는 서비스 계층 설계와 구현을 단계별로 설명했으며, 이를 기반으로 다른 모듈도 비슷한 방식으로 설계할 수 있습니다.

반응형

+ Recent posts