Developer/Spring eGov4.0 (Java11, Tomcat9)

spring , service를 나누는 이유

단님 2024. 9. 27. 00:37
728x90
Service를 인터 페이스와 구현 클래스로 나누는 이유

 

Service 클래스를 인터페이스로 만들어서 구현하는 방식은 스프링에서 자주 사용되는 디자인 패턴이다.

이렇게 하면 확장성과 유지보수성이 크게 향상된다.

여기서 중요한 개념은 느슨한 결합높은 응집도인데, 인터페이스를 사용하면 각 클래스들이 서로 강하게 결합되지 않고, 기능이 변경되더라도 서로 영향을 덜 받게 된다.

 

 

  • 인터페이스로 Service 작성:
    • 인터페이스는 클래스들이 따라야 할 규칙을 정의한다.
      이를 통해 여러 구현체가 동일한 메서드를 사용할 수 있게 되고, 이후 필요에 따라 구현체만 변경하면 된다.
    • 인터페이스는 구체적인 비즈니스 로직을 포함하지 않고, 어떤 작업을 수행해야 하는지 정의만 제공한다.
  • Service 구현 클래스 작성:
    • 인터페이스를 구현하는 클래스는 실제 비즈니스 로직을 처리하는 역할을 한다.
    • 여러 클래스를 만들어 각기 다른 구현을 제공할 수 있으며, 필요에 따라 어떤 클래스가 사용할지 선택할 수 있다.
    • 클래스로 되어있는 현재 파일의 이름을 구현체(이름뒤에 impl을 붙임)로 정의.

 

[✔️인터페이스 정의 ]

서비스인터페이스는 정보를 처리하는 동작에 대해 정의 한다.

public interface MemberService {
    List<MemberDTO> selectList();  // 회원 목록 조회
    MemberDTO selectOne(String id);  // 특정 회원 조회
    int insert(MemberDTO dto);  // 회원 추가
    int update(MemberDTO dto);  // 회원 정보 수정
    int delete(MemberDTO dto);  // 회원 삭제
}

 

[✔️인터페이스 구현 클래스 ]

구현된 클래스는 구체적인 비즈니스 로직을 작성한다.

데이터베이스와 상호작용 하거나 다른 로직을 처리할 수 있다.

추후 메서드의 return 교체로 다양한 동작을 교체할 수 있다.

@Service 애노테이션을 사용한다.

@Service
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberDAO memberDAO;  // DAO 주입

    @Override
    public List<MemberDTO> selectList() {
        return memberDAO.selectList();
    }

    @Override
    public MemberDTO selectOne(String id) {
        return memberDAO.selectOne(id);
    }

    @Override
    public int insert(MemberDTO dto) {
        return memberDAO.insert(dto);
    }

    @Override
    public int update(MemberDTO dto) {
        return memberDAO.update(dto);
    }

    @Override
    public int delete(MemberDTO dto) {
        return memberDAO.delete(dto);
    }
}

 

 

@Service
비즈니스로직을 처리하는 애노테이션.
스프링이 해당 클래스를 서비스 레이어로 인식하고 으로 등록할 수 있게 하는 역할을 한다.

@Component와 비슷한 역할을 하지만,
의미적으로 명확하게 서비스 레이어를 나타내기 위해 @Service가 사용된다.

 

 

service의 구현에 대하여 포스팅을 남겨두었다.

 

주요 특징

 

  • 비즈니스 로직 클래스에 사용:
    @Service는 비즈니스 로직을 구현하는 클래스를 의미함.
    일반적으로 데이터베이스의 처리 로직, 다양한 연산, 조건에 따른 처리 등 주요 애플리케이션 로직이 포함된 클래스에 사용된다.
  • 스프링 컨테이너에 의해 빈으로 등록:
    @Service로 선언된 클래스는 스프링 컨테이너에 의해 자동으로 빈(bean)으로 등록된다.
    이를 통해 해당 클래스를 다른 컴포넌트(@Controller, @Repository 등)에서 주입받아 사용할 수 있음.
  • 서비스 레이어 분리:
    서비스 레이어는 컨트롤러데이터 접근 객체(DAO) 사이에서 중개 역할을 한다.
    이 구조는 비즈니스 로직을 명확하게 분리하여 유지보수성을 높이고, 컨트롤러가 비즈니스 로직과 너무 밀접하게 결합되지 않도록 도와준다.
  • 계층 구조 설계:
    스프링 애플리케이션은 계층 구조로 설계되며, @Service는 컨트롤러와 DAO(또는 리포지토리) 사이에서 중간 레이어로 작동해. 이 구조는 모듈화와 재사용성을 높임
  • 자동 주입:
    @Service 애노테이션을 사용하면 다른 클래스에서 @Autowired를 통해 해당 클래스의 인스턴스를 주입받을 수 있다. 이는 스프링이 의존성 주입을 통해 빈을 관리하기 때문에 가능함.

 

애노테이션의 역할 분리

 

[✔️@Component ]

➡️모든 스프링 컴포넌트에 사용할 수 있는 일반적인 애노테이션

@Service, @Repository, @Controller도 내부적으로 @Component를 상속하지만,
특정한 역할을 명확히 하기 위해 구분해서 사용

 

[✔️@Repository ]

➡️ DAO 클래스에서 사용. 데이터베이스와의 상호작용 로직을 처리하며, 예외 처리를 돕는 기능을 제공

 

[✔️@Service ]

➡️해당 클래스가 스프링에서 서비스 레이어로 동작하며, 비즈니스 로직을 처리하는 클래스를 의미

 

[✔️@Controller ]

➡️ 클라이언트의 HTTP 요청을 처리하고, 적절한 (view)로 반환하는 역할을 담당해.

주로 웹 애플리케이션에서 사용