확장성과 유지보수성이 좋은 애프리케이션의 구조는 다음과 같다.

 

1. Domain 레이어:

도메인 레이어는 애플리케이션의 핵심 로직을 담당하는 레이어다. 게시물, 댓글, 사용자 등의 도메인 모델을 구현하고, 비즈니스 로직을 처리한다. 이 레이어에서는 R2DBC를 사용하여 데이터베이스와 연동한다


2. Repository 레이어:

리포지토리 레이어는 데이터베이스와의 상호작용을 담당하는 레이어다. 도메인 레이어에서 사용하는 데이터를 저장, 검색, 삭제 등의 CRUD 작업을 처리한다. 이 레이어에서는 Spring Data R2DBC를 사용한다.

 

3. Service 레이어:
서비스 레이어는 비즈니스 로직을 처리하는 레이어다. 도메인 레이어와 리포지토리 레이어를 조합하여, 애플리케이션의 기능을 제공한다

 

4. Web 레이어:

웹 레이어는 사용자의 요청을 처리하는 레이어다. 요청에 대한 처리 후, 도메인 레이어와 서비스 레이어를 이용하여, 응답을 생성한다. 이 레이어에서는 스프링 웹플럭스를 사용한다.

 

4. Security 레이어:
 보안 레이어는 애플리케이션의 보안을 담당하는 레이어다. 인증, 인가, 접근 제어 등의 기능을 처리한다.


5. Configuration 레이어:

컨피규레이션 레이어는 스프링 웹플럭스와 관련된 설정을 담당하는 레이어다. 예를 들어, 라우터, 핸들러, 필터 등의 설정을 처리한다.

 

6. Test 레이어:
테스트 레이어는 단위 테스트, 통합 테스트, E2E 테스트 등의 테스트를 담당하는 레이어다. 이 레이어에서는 JUnit, Mockito, WebTestClient 등의 테스트 프레임워크를 사용한다.

 

이렇게 레이어를 분리해서 개발하면 개발자들 간의 협업이 원할해진다 !

'웹개발 > 설계' 카테고리의 다른 글

JPA로 페이징된 계층형 댓글 로직 구현에 대해  (0) 2024.03.07
JPA DTO & Entity란?  (0) 2022.08.02
웹개발 CRUD 작업 시 팁  (0) 2022.08.02

1. 프로젝트 환경 선택

 

사용할 IDE : 인텔리제이

사용할 Java version: java 8 (1.8)

사용할 스프링부트 version : 2.4.2 

사용할 빌드 도구 : Maven (메이븐)

사용할 배포 타입: Jar

 

자바 8을 선택한 이유:

아직 9이상 버전은 공부 하지 않았다. 8로도 내가 구상한 프로젝트를 하는데 지장없을 것 같다.

이 부분은 본인 학습 정도에 따라 선택하면 될 것 같다.

 

https://lenagend.tistory.com/28

 

java8과 java9의 차이 간단 요약

1. 모듈 시스템: Java 9에서는 모듈 시스템이 도입되어 모듈화된 소프트웨어를 더 쉽게 개발하고 관리할 수 있다. 2. JShell: JShell은 대화 형 셸 도구로, 코드를 입력하고 즉시 실행 결과를 확인할 수

lenagend.tistory.com

스프링부트 2번대를 선택한 이유:

스프링 부트는 현재 3 이상버전이 출시 된 상태지만

자바17버전 이상부터 사용해야 하기도 하고, 학습하는 입장에서 데이터가 많이 쌓여 안정적인 2를 선택했다.

 

메이븐을 선택한 이유:

그래들이 여러모로 장점이 많긴 한데, 이번 프로젝트에서는 Maven으로도 무리 없을 것 같아 익숙한 메이븐을 선택했다.

 

https://lenagend.tistory.com/29

 

Gradle과 Maven 차이 간단 요약

Gradle과 Maven은 모두 Java 프로젝트의 빌드, 테스트, 배포 등을 자동화하는 빌드 도구입니다. 그러나 둘 사이에는 몇 가지 차이가 있다. 1. 빌드 스크립트 언어: Gradle은 Groovy 또는 Kotlin 언어를 사용

lenagend.tistory.com

 

Jar파일을 선택한 이유:

War는 서블릿 컨테이너에서 실행해야하는데(더 많은 설정 필요) Jar는 단독실행이 가능하기 때문.

 

https://lenagend.tistory.com/31

 

Jar파일과 War파일 차이 간단 요약

스프링 부트 프로젝트에서 Jar와 War 파일은 빌드된 애플리케이션의 배포 형식을 나타낸다. 1. 배포 형식: Jar 파일은 단독 실행 가능한 Java 애플리케이션을 배포하기 위해 사용되고, War 파일은 Java

lenagend.tistory.com

 

 

 

2. 프로젝트 생성

스프링부트 프로젝트를 생성할 수 있는 방법은 몇가지 있다.

 

1. https://start.spring.io/ 에서 생성 후 IDE에서 Import

2. 이니셜제이, STS등 IDE에서 생성

 

나는 거치는 단계가 더 적은 2번을 선택했다.

 

File -> Project -> New Project -> Spring Initializr 선택 후 각 정보를 채워넣는다. 

프로젝트 환경 선택<- 에서 본인이 선택한 정보를 입력하면 된다. 직관적으로 되어있어 설명이 필요없다.

 

 

 

https://lenagend.tistory.com/30

 

스프링 프로젝트 Group, Artifact, Package name 간단 요약

Group: 프로젝트를 생성하는 조직의 이름을 나타냅니다. 예를 들어, com.example과 같은 패키지 이름과 비슷합니다. Group 이름은 프로젝트를 다른 프로젝트와 구분하는 데 사용된다. Artifact: 프로젝트

lenagend.tistory.com

 

첫번째 화면에서 Next를 누르면 스프링 부트 버전과 스프링부트 스타터 디펜던시들을 설정할 수 있다.

Dependency란 쉽게말하면 어떤 기능을 가지고 있는 모듈과 연결 시키는 것이다.

 

나는 비동기 처리를 도와주는 Spring Reacive Web과 그것을 지원하는 데이터베이스 중에 MongoDB를 선택했다.

 

DevTools는 스프링부트 애플리케이션을 더욱 쉽게 개발, 테스트, 배포할 수 있도록 지원하는 스프링 부트 기능 중 하나다.

코드를 수정하면, 자동으로 다시 빌드를 시작해서 더 편하게 수정한 결과를 확인할 수 있다.

 

Thymeleaf는 서버사이드 Java 템플릿 엔진인데, 스프링부트에서 권장하는 방식이고 HTML, XML, JavaScript, Css 등의 문서를 처리해서 서버에서 동적으로 생성된 컨텐츠를 클라이언트에게 제공하는 방식이다.

 

React.js 사용으로 타임리프는 거의 쓰지 않을 예정이지만 간단한 테스트 결과를 출력해보기 위해 선택했다.

 

이제 Finish를 선택하면 스프링부트 웹플럭스 프로젝트가 생성된다.

스프링 부트 프로젝트에서 Jar와 War 파일은 빌드된 애플리케이션의 배포 형식을 나타낸다.

1. 배포 형식: Jar 파일은 단독 실행 가능한 Java 애플리케이션을 배포하기 위해 사용되고, War 파일은 Java 웹 애플리케이션을 배포하기 위해 사용된다.

2. 구조: Jar 파일은 실행 가능한 Java 애플리케이션을 위해 필요한 클래스와 리소스가 포함된 단일 아카이브 파일이다. War 파일은 웹 애플리케이션을 위해 필요한 클래스, 리소스, JSP 파일, HTML 파일 및 웹 리소스와 같은 다른 파일들을 포함한 웹 애플리케이션 아카이브 파일이다.

3. 실행: Jar 파일은 명령어를 통해 Java 애플리케이션을 실행할 수 있다. War 파일은 Java Servlet 컨테이너를 사용하여 웹 애플리케이션을 실행한다.

4. 의존성: Jar 파일은 모든 의존성 라이브러리를 포함할 수 있다. War 파일은 일반적으로 서블릿 컨테이너에 배포되므로, 서블릿 컨테이너가 사용하는 라이브러리를 포함할 필요는 없다.

즉, Jar 파일은 단독 실행 가능한 Java 애플리케이션을 배포하기 위한 파일이며, War 파일은 Java 웹 애플리케이션을 배포하기 위한 파일이다.

Group: 프로젝트를 생성하는 조직의 이름을 나타냅니다. 예를 들어, com.example과 같은 패키지 이름과 비슷합니다. Group 이름은 프로젝트를 다른 프로젝트와 구분하는 데 사용된다.

Artifact: 프로젝트의 이름을 나타냅니다. 예를 들어, my-project와 같습니다. 이는 다른 프로젝트와 같은 그룹에서 프로젝트를 구분하는 데 사용된다.

Package name: 소스 코드의 패키지 이름을 나타냅니다. 예를 들어, com.example.myproject와 같습니다. 패키지 이름은 소스 코드의 구조를 정의하는 데 사용됩니다. 스프링 부트 프로젝트에서는 패키지 이름에 따라 다른 기능을 제공하는 스프링의 컴포넌트 스캔이 이루어진다.

즉, Group은 조직이나 회사의 이름, Artifact는 프로젝트 이름, Package name은 소스 코드의 패키지 이름을 나타내며, 이들은 각각 프로젝트를 식별하고 관리하기 위한 것.

Gradle과 Maven은 모두 Java 프로젝트의 빌드, 테스트, 배포 등을 자동화하는 빌드 도구입니다. 그러나 둘 사이에는 몇 가지 차이가 있다.

1. 빌드 스크립트 언어: Gradle은 Groovy 또는 Kotlin 언어를 사용하여 빌드 스크립트를 작성할 수 있습니다. 반면에 Maven은 XML을 사용한다.

2. 빌드 성능: Gradle은 이전에 수행한 빌드와 변경된 파일만 처리하여 더 빠른 빌드를 제공합니다. Maven은 이전에 수행한 빌드와 관계없이 모든 작업을 수행한다.

3. 의존성 관리: Gradle은 의존성 그래프를 통해 라이브러리를 관리합니다. 이는 더 높은 유연성과 편의성을 제공합니다. Maven은 의존성 관리를 중앙 리포지토리에서 가져오는 방식으로 수행한다.

4. 멀티 프로젝트 빌드: Gradle은 멀티 프로젝트 빌드를 더욱 쉽게 수행할 수 있습니다. Maven은 각 프로젝트를 개별적으로 빌드해야 한다.

5. 플러그인: Gradle은 플러그인을 사용하여 빌드 프로세스를 확장할 수 있습니다. Maven은 플러그인을 사용하지만 플러그인을 작성하기 위해서는 Java를 사용해야 한다.

6. 문서화: Gradle은 빌드 스크립트의 자동 문서화를 지원합니다. Maven은 문서화 기능을 추가로 설치해야 한다.

7. 빌드 캐시: Gradle은 빌드 캐시를 사용하여 중복 작업을 방지합니다. Maven은 빌드 캐시를 지원하지 않는다.

8. 테스트 실행: Gradle은 테스트 실행에 대한 세밀한 제어를 제공합니다. Maven은 제한된 테스트 실행 제어를 제공한다.

1. 모듈 시스템: Java 9에서는 모듈 시스템이 도입되어 모듈화된 소프트웨어를 더 쉽게 개발하고 관리할 수 있다.

2. JShell: JShell은 대화 형 셸 도구로, 코드를 입력하고 즉시 실행 결과를 확인할 수 있다.

3. 향상된 성능: Java 9은 GC 및 컴파일러의 개선으로 인해 더욱 향상된 성능을 제공한다.

4. 인터페이스 개선: Java 9에서는 인터페이스에 private 메서드와 private 정적 메서드를 추가할 수 있다.

5. 컬렉션 팩토리 메서드: Java 9에서는 컬렉션을 생성하는 새로운 팩토리 메서드가 도입되었다.

6. 플랫폼 모듈화: Java 9에서는 플랫폼 모듈화가 도입되어 JDK 모듈과 애플리케이션 모듈을 분리하여 더욱 효율적으로 개발 및 관리할 수 있다.

7. HTTP/2 지원: Java 9에서는 HTTP/2 지원이 추가되었다.

8. 스택 워커: Java 9에서는 스택 워커라는 새로운 개념이 도입되어 멀티 스레딩 환경에서 더욱 효율적으로 작업을 처리할 수 있다.

 

WebFlux 프로젝트 중에 

Flux<Post> findAllBy(Pageable pageable);

게시글을 특정부분만 블럭해서 가지고 오려고 pageable을 인자로 받고

스프링부트 프로젝트를 실행했다

프로젝트는 정상 빌드.

그러나 url뒤에 ?page=2&size=5 등의 파라미터를 입력하자 

No primary or default constructor found for interface org.springframework.data.domain.Pageable

오류가 떴다.

WebFlux 설정으로 해결했다.

@Configuration
public class PageableWebFluxConfiguration implements WebFluxConfigurer {

    @Override
    public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
        configurer.addCustomResolver(new ReactivePageableHandlerMethodArgumentResolver());
    }
}

 

 

해당 설정이 파라미터들을 알아서 해석해서 바인딩 해주는 듯하다.

 

API란?

API는 애플리케이션 소프트웨어를 구축하고 통합하기 위한 정의 및 프로토콜을 포함하는 애플리케이션 프로그래밍 인터페이스이다.

API를 사용하면 구현 방법을 몰라도 제품 또는 서비스가 다른 제품 및 서비스와 통신할 수 있다.

(사물 인터넷)

그래서 API는 합의가 있어야한다. 서비스2가 응답한 데이터를 요청한 서비스1이 별도의 해석 없이 바로 읽어야 하지 않겠는가.

 

→ 웹API는 일반적으료 요청 메세지에 HTTP를 사용하고 응답받을 메세지 구조의 정의를 제공한다.

→ 이러한 응답 메세지는 일반적으로 XML또는 JSON 파일 형식을 취한다.

→ XML과 JSON파일인 이유는 단순히 다른 앱에서 쉽게 조작할 수 있는 방식으로 데이터를 표시하기 때문이다.

+ Recent posts