Service 계층과 DI(Dependency Injection)
컨트롤러에 모든 코드를 넣게 되면 프로젝트가 커질수록 유지보수가 불가능해집니다. 따라서 핵심 비즈니스 로직(예: 중복 검사, 할인율 계산 등)은 Service 계층에 작성하고, 스프링의 핵심 기능인 DI(의존성 주입)를 이용해 Controller에 연결해 줍니다.
⚠️ 주의: @Transactional 의 중요성
데이터베이스 상태를 변경하는(Insert, Update, Delete) 서비스 로직은 반드시 @Transactional 어노테이션을 붙여야 합니다. 이를 통해 중간에 에러가 나더라도 데이터가 안전하게 롤백(Rollback) 됩니다.
실전 코딩: Service 클래스 구현 및 주입
package com.minstudio.demo.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
@Service // 스프링 빈으로 등록
@RequiredArgsConstructor // final 필드의 생성자를 자동으로 만들어 의존성 주입(DI) 완성
public class MemberService {
// MemberRepository가 자동으로 주입됨
private final MemberRepository memberRepository;
@Transactional
public Long createMember(String name) {
// 비즈니스 로직: 이름 중복 검사 등...
Member member = new Member();
member.setName(name);
Member savedMember = memberRepository.save(member);
return savedMember.getId();
}
}
DI 완료: MemberController ➔ MemberService ➔ MemberRepository 구조가 완성되었습니다.