Layered Architecture

eunhye_·2023년 3월 14일
0

Layered Architecture(N-tier Architecture)란?

말 그대로 계층이 있는 아키텍쳐.
각 계층은 수평적으로 구성이 되고, 각 계층마다 특정 역할을 한다.

보통은 아래의 4계층으로 구성된다.

  • Presentation
  • Bussiness
  • Persistence
  • Database

하지만 Application의 규모에 따라서 3- 5 개 등의 구조를 가질 수 있음.

AOP처럼 횡단관심사로 분리해서 수평 계층으로 구성되어 각각의 layer는 하나의 관심사만 집중할 수 있도록 하는 것이다.

주요 개념


Layered Architecture에서는 각 계층마다 화살표를 통해 흐름을 이어간며 각 계층을 뛰어넘을 수 없다. ( Presentation → Persistence)

왜 뛰어넘을 수 없을까?

@RestController
@RequestMapping("/layered")
@RequiredArgsConstructor
public class TestController {
    private final TestRepository testRepository;
	private final TestService testService;
    
    @Transactional
    @GetMapping
    public Test getUserInfo(TestReqDto reqDto) {
        Optional<Test> byId = testRepository.findById(1L);
        Test test = byId.orElse(new Test());
        test.updateUserInfo(reqDto);
        return testService.getUserinfo();
    }
}

@Entity
@Table(name = "test")
public class Test {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 고유번호 PK
    private String name; // 이름
    private int age; // 나이
    private String gender; // 성별
    private String email; // 이메일
    private String contact; // 연락처

    public void updateUserInfo(TestReqDto updateDto) {
        this.name = updateDto.getName();
        this.gender = updateDto.getGender();
        this.email = updateDto.getEmail();
        this.contact = updateDto.getContact();
    }
}

위의 코드와 같이 Controller에서 Domain 간의 관계가 밀접하게 연관이 되고, 변경사항이 Service와 Repository에 퍼지게 된다.
+추후 수정도 어려워진다.

때문에 각 계층은 서로에게 관심을 두지 않고 필요에 의해서 찾는 관계가 되어야한다.

예시

표현계층 (Presentation Layer)

사용자의 요청에 대해서 해석, 응답하는 계층

  • 로깅
  • 인증(보안)

ex) Controller

@RestController
@RequestMapping("/layered")
@RequiredArgsConstructor
public class TestController {
		private final TestService testService;

    @GetMapping
    public Test updateUser(TestReqDto reqDto) {
        return testService.updateUserInfo(reqDto);
    }
}

응용 프로그램 계층(Bussiness Layer)

실질적인 비즈니스 로직을 처리하는 계층. (보통 Service를 뜻 함.)

도메인(Domain Layer)과 인프라스트럭쳐(InfraStructure Layer)를 연결

// 인터페이스
public interface TestService {
    D_Test updateUserInfo(TestReqDto reqDto);
}

// 구현체
@Service
@RequiredArgsConstructor
public class TestServiceImpl implements TestService {
    private final TestRepository repository;
    @Override
    public Test updateUserInfo(TestReqDto reqDto) {
				if(reqDto.getId() == null || reqDto.getId() == 0) {
					throw new CommonException("존재하지 않는 아이디 입니다.");
				}
        return repository.findById(reqDto.getId()).orElse(null);
    }
}

영속성 계층(Persistence Layer)

DB에 접근하는 계층. Business에서 온 요청으로 조회 함.

DDD에서 쓸 때에는 도메인 레이어라고 부르는 것 같음

도메인 계층(Domain Layer)

도메인 : 소프트웨어로 해결하고자 하는 문제 영역

예를 들어 쇼핑몰이 있다면 쇼핑몰 자체가 하나의 도메인이 되고,
그 아래

  • 고객 (Customer)
  • 판매자 (Seller)
  • 주문 (Order)
  • 포인트 (Point)
  • 결제 (Payment)
  • 배송 (Delivery)
    등등 하위 도메인으로 나눌 수 있다.
@Entity
@Table(name = "domain_test")
public class DomainTest {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 고유번호 PK
    private String name; // 이름
    private int age; // 나이
    private String gender; // 성별
    private String email; // 이메일
    private String contact; // 연락처

    public void updateUserInfo(TestReqDto updateDto) {
        this.name = updateDto.getName();
        this.gender = updateDto.getGender();
        this.email = updateDto.getEmail();
        this.contact = updateDto.getContact();
    }
}

Layered Architecture의 장점

  • 배우기 쉬움
  • 느슨한 연결을 이용해, 자신의 관심사만 집중할 수 있음
  • 비즈니스 로직을 유지해서 유지보수와 확장성 측면에서 이득을 얻을 수 있음.
  • 재사용성 높음

Layered Architecture의 단점

  • 서비스가 커질수록 복잡도가 증가해 확장성이 떨어짐
  • 싱크홀 안티패턴을 고려해야 함.

Refference
https://velog.io/@jeb1225/DDD의-계층구조Layered-architecture
https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html

0개의 댓글