개요인터넷을 돌아다니던 도중.. 리스트에 단일한 객체만 들어가는 경우 Collection.singletonList() 를 사용하는 것이 좋다는 글을 보았다.테스트 코드인 경우 유용함 - 실 비즈니스 로직엔 싱글톤보단 단순 리스트 사용하는 게 확장에 유리하기에.. 실제로 GPT 도 싱글톤 리스트를 추천하는 것을 보았다.왜 싱글톤 리스트를 단일값인 경우 사용하는 거지?일단 장점이 몇가지 있다.불변성Collections.singletonList 는 불변 리스트를 생성한다.해당 리스트는 단 하나의 요소만 포함되고, 생성 후에는 해당 요소를 추가하거나 제거할 수 없다!메모리 효율사실 정말 미미한 정도라 의미가 있나 싶지만…테스트 코드는 최대한 가벼워야한다고 생각한다!내부적으로 단일 요소만을 저장하기에, 메모리 사..
Spring Security 5.7.11 기준이다.스프링 시큐리티에는 컨트롤러에 역할(Role) 기반 접근 제한을 설정하는 방법에 여러 가지가 있는데,가장 일반적인 방법으로는 @PreAuthorize 또는 @Secured 어노테이션을 사용하는 것이다.해당 어노테이션은 메서드 수준의 보안이 가능하다.@PreAuthorize특정 역할을 가진 사용 역할을 가진 사용자만 메서드를 호출할 수 있도록 제한할 수 있다.@Controller public class SomeController { @PreAuthorize("hasRole('ROLE_ADMIN')") @RequestMapping("/adminOnly") public String adminOnly() { // 관리자만 접근 가능한 로직 return "admi..
계산 로직과 도메인 서비스할인 금액 계산과 같이 애그리거트에 포함시키기 애매한 도메인 개념을 구현할 때도메인 서비스를 사용해서 해당 개념을 명시적으로 표현할 수 있음.서비스 응용 영역이 어떤 서비스에 대한 로직을 다루는 반면에 도메인 서비스에서는 도메인 로직과 관련되어 있지만 도메인 안에서 처리하기 더 범위가 넓은 개념의 로직을 해당 도메인 서비스 로 옮긴다.할인 금액 로직을 위한 DiscountCalculationServicepublic class DiscountCalculationService { public Money calculateDiscountAmounts( List orderLines, List coupons, MemberGrade grade) { Money couponDiscount = c..
개요외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있음.도메인 서비스는 도메인의 로직 관점에서 인터페이스를 작성, 인프라스트럭처 영역에서 구현예시도메인 서비스 인터페이스public interface SurveyPermissionChecker { boolean hasUserCreationPermission(String userId); }응용 서비스public class CreateSurveyService { private SurveyPermissionChecker permissionChecker; public Long createSurvey(CreateSurveyRequest req) { validate(req); // 도메인 서비스를 이용해서 외부 시스템 연동을 표현 if (!perm..