관심사 분리(Separation of Concerns, SoC)란 하나의 소프트웨어 시스템을 관심사 별로 나누는 설계 원칙이다. 이 원칙에 따르면, 각각의 관심사는 독립적으로 동작하고 변경되어야 한다. 이렇게 하면 코드의 응집도가 높아지고, 결합도가 낮아져 유지보수가 용이해진다.
스프링 프레임워크는 IoC(Inversion of Control, 제어의 역전)와 DI(Dependency Injection, 의존성 주입)를 통해 관심사를 분리한다.
@Controller
public class SomeController {
private final SomeService someService;
public SomeController(SomeService someService) {
this.someService = someService;
}
@GetMapping("/some")
public String getSome(Model model) {
SomeDto someDto = someService.getSome();
model.addAttribute("some", someDto);
return "some";
}
}
@Service
public class SomeService {
private final SomeRepository someRepository;
public SomeService(SomeRepository someRepository) {
this.someRepository = someRepository;
}
public SomeDto getSome() {
SomeEntity someEntity = someRepository.findById(1L).orElseThrow();
return new SomeDto(someEntity);
}
}
@Repository
public interface SomeRepository extends JpaRepository<SomeEntity, Long> {}
위 예제에서는 각 계층(Controller, Service, Repository)이 자신의 관심사만을 담당하고 있다. Controller는 사용자의 요청을 받아 처리하고, 그 결과를 전달하는 역할만 수행한다. Service는 비즈니스 로직을 처리하고, Repository는 데이터베이스와의 연동 작업을 담당한다. 이처럼 각 계층이 자신의 관심사만을 담당하도록 함으로써, 각 계층의 독립성을 보장하고 코드의 유지보수를 용이하게 한다.
오늘의 학습을 통해 스프링에서의 관심사 분리에 대해 다시금 생각해 볼 수 있었다. 각 계층이 자신의 관심사만을 담당하도록 함으로써, 코드의 응집도를 높이고, 결합도를 낮추는 것이 얼마나 중요한지를 깨달았다. 이를 통해 코드의 유지보수성을 높일 수 있음을 알게 됐다. 앞으로도 이런 원칙을 잊지 않고, 더 품질 좋은 코드를 작성하고자 한다.