각 계층을 대표하는 패키지를 기준으로 코드들을 구성한 방식이다. 대표적으로 controller, service, dao, dto 구조로 되어있는데, 같은 역할을 하는 코드끼리 응집시키며 다음 사진과 같다.

해당 프로젝트의 이해도가 낮아도 전체적인 구조를 빠르게 파악할 수 있다는 장점이 있다.
반대로 특정 패키지에 너무 많은 클래스가 모이게 된다는 단점을 가진다.
도메인(주체)을 기준으로 패키지를 구성한 방식이다. 주문 시스템을 예로 들면 사용자, 지점, 주문을 하나의 도메인으로 보고 이를 패키지로 구성한다. 다음 사진의 경우 domain이라는 패키지 내부에 도메인 별 패키지를 입력한 뒤, 각 도메인 별 패키지마다 계층 구조를 두도록 했다.

비슷한 목적, 성격을 가진 코드들이 하나의 패키지 내에 모여있기 때문에 응집성이 좋다는 장점이 있다. 이는 패키지의 이름만 봐도 어떤 역할을 하는지 직관적으로 알 수 있도록 도와준다. 또한 연관된 코드들이 모여있기 때문에 코드 스타일, 변수, 클래스 이름을 서로 참고하여 비슷한 패턴으로 개발할 수 있다.
그러나 해당 프로젝트의 이해도가 낮을 경우 전체적인 구조를 파악하기 어렵다는 단점이 있다.
줄곧 계층형 구조를 이용하다 최근에 도메인형 구조를 사용했다. 실제로 하나의 도메인에서 움직이기 때문에 코드 스타일, 변수 이름, 클래스 이름을 편하게 작성할 수 있었다. 또한 계층형 구조보다 코드가 정돈되었다는 느낌을 많이 받았다. 이는 코드를 탐색하고 저장하는데 많은 이점을 주었다. 조금 더 이용해보고 도메인형에 대해 더 자세한 후기를 쓸 예정이다.