Spring Boot Service Layer

devyunie·2024년 8월 23일

SpringBoot

목록 보기
8/13
post-thumbnail

Service Layer

  • Service 레이어는 Spring 레이어드 아키텍처에서 비즈니스 영역에 해당한다.
  • 실제 비즈니스 로직을 실행하는 영역
  • 트랜잭션(기능 단위) 처리 , 유효성 검사(이전 트랜잭션 결과의 유효성 검사)를 수행
  • Controller로 부터 받은 요청을 처리하고 해당 처리 중 데이터베이스 작업이 필요하면 Repository영역으로 요청

Service 생성

Base Package 아래에 Service 패키지 생성 → Service 패키지에 Service 인터페이스 생성 → Service 패키지 아래에 Implement 패키지 생성 → Implement 패키지에 Service 구현 클래스 생성


Service 생성의 잘못된 예

  • Spring Bean을 통해서 객체를 관리하지 않음
    1. 경로: Base > controller > ServiceController.java
@RestController
@RequestMapping("/service")
public class ServiceController {

// 잘못된 예시
// BasicServiceImplement service = new BasicServiceImplement();

// 인터페이스에 의존하고 있다
private BasicService basicService = new BasicServiceImplement();
	
	@GetMapping("")
	public ResponseEntity<String> getService() {
		return basicService.getService();
	};
}
    1. 경로: Base> Service > BasicService.java
public interface BasicService {
	ResponseEntity<String> getService();
}
    1. 경로: Base > Service > implement > BasicServiceImplement.java
public class BasicServiceImplement implements BasicService{
	@Override
	public ResponseEntity<String> getService(){
		return ResponseEntity.status(HttpStatus.OK).body("서비스 호출");
	}
}

Service 올바른 생성 방법

의존성 주입(DI)

  • 해당 모듈에 필요한 의존성을 외부(클래스의 인스턴스를 생성하는 위치)에서 생성
  • 생성자를 통한 의존성 주입, Setter메서드를 통한 의존성 주입, 필드를 통한 의존성 주입
  • spring framework에서 권장하고 있는 의존성 주입 방법은 생성자를 통한 의존성 주입(의존성이 주입되지 않은 상태가 존재할 수 없기 때문)
  • spring FrameWork에서 IoC를 통해 의존성을 주입할 땐 주입할 인스턴스의 클래스가Spring Bean으로 등록되어있어야 함

@Service

  • 해당 클래스를 Spring Bean으로 등록하는 어노테이션
  • @Component와 동일하지만 가독성 향상을 위해 Service이름을 사용
//Service 어노테이션 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
	/**
	* Alias for {@link Component#value}.
	*/
	@AliasFor(annotation = Component.class)
	String value() default "";
}
  • 경로: Base > Service > implement > BasicServiceImplement.java
@Service //@Component가 포함되어 있다.
public class BasicServiceImplement implements BasicService{
	@Override
	public ResponseEntity<String> getService(){
		return ResponseEntity.status(HttpStatus.OK).body("서비스 호출");
	}
}

@AutoWired

  • 등록된 Spring Bean을 제어 역전을 통해 의존성 주입을 할 수 있도록 하는 어노테이션

  • 경로: Base > controller > ServiceController.java

@RestController
@RequestMapping("/service")
@AllArgsConstructor
public class ServiceController {
	
	private BasicService basicService; //필수

	//생성 방법
	//1. 필드 객체 
	//2. Setter 메서드 사용
	//3. 생성자 이용
	
	@GetMapping("")
	public ResponseEntity<String> getService() {
		return basicService.getService();
	};
}

생성 방법 (3가지)

  1. 필드객체 이용
@Autowired
private BasicService basicService;
  1. Setter 메서드 이용
private BasicService basicService;
@Autowired
public void setBasicService(BasicService basicService){
	this.basicService = basicService;
}
  1. 생성자 이용
private BasicService basicService;
//@Autowired
public ServiceController(BasicService basicService){
	this.basicService = basicService;
}
  • 생성자를 통한 의존성 주입 방식에는 @Autowired를 적어줄 필요가 없음
  • private BasicService basicService; 해당 구문은 작성 하지만 생성자 같은경우는 Lombok을 이용하여 생성이 가능하다.
  • ‼️ final을 통해 @RequiredArgsConstructor 을 통한 생성자 활용 (응용 -> 특정 생성자)

  • 경로: Base> Service > BasicService.java
public interface BasicService {
	ResponseEntity<String> getService();
}

  • 실행결과

0개의 댓글