Java Spring for Beginner를 사용한 RESTful 서비스 구조


12

Java 웹 개발 기술 측면에서 비교적 새롭습니다. API에 대해 거의 이해하지 못하는 RESTful 서비스에 대한 좋은 후보자가 될 것이라고 생각하는 프로젝트가 있습니다. 나는 이것이 어떻게 구성되어야하는지에 대한 세부 사항을 찾으려고 노력하고 있지만 실제로 Google 검색 및 이미 가지고있는 자료를 읽을 수는 없습니다. 이 게시물 이이 주제에 대한 내 지식과 가정의 관점에서 일부 유효성 검사 및 / 또는 리디렉션을 생성하기를 희망합니다.

나의 현재 가정은 RESTful 서비스가 다음과 같은 구조를 가질 것이라고 가정합니다.

  • 데이터베이스 데이터 (SQL).
  • ORM (CPO라는 비교적 인기없는 ORM을 사용하고 있지만 대부분의 사람들과 함께 최대 절전 모드로 대체됩니다).
  • 데이터를 얻기 위해 ORM과 통신하는 메소드가있는 Java 관리자 클래스
  • 요청 매핑을 @ResponseBody처리하고 HTTP 동사 ( http://mysite.com/computers/dellGET"dell"이라는 단어 로 요청 될 수 있음) 를 통해 URL 및 데이터 처리 방법에 대한 조치를 지시하고 처리하는 데 사용되는 Java 컨트롤러 클래스 / 클래스 URL에서 Dell 컴퓨터에 대한 JSON 정보 배열을 반환하는 매개 변수)
  • 이 서비스는 Spring Boot를 사용하거나 단독으로 사용할 수 있고 다른 응용 프로그램과 독립적이어야합니다.

위의 내용이 정확하다고 가정하면 모든 응용 프로그램이 데이터를 소비하고 사용하는 데 사용할 수있는 RESTful 서비스 (기본 수준)가 있습니다.

그렇다면 웹 응용 프로그램을 가지고 있다고 가정하십시오. 컴퓨터 하드웨어 정보에 대한 웹 앱을 만들고 있으며 스프링을 사용하여이 웹 앱을 빌드한다고 가정하겠습니다. 내 가정은 다음과 같습니다.

  • HTML, CSS 및 JavaScript를 포함하는 JSP와 함께 JSP로 많은 견해를 가지고 있습니다. JavaScript는 필요에 따라이 애플리케이션 컨트롤러에 대한 AJAX 호출을 처리합니다 (아래).
  • 이 웹앱은 또한 앱의 URL 요청 및 라우팅을 처리하는 자체 컨트롤러를 가지고 있으며 컨트롤러는 ModelAndViewRESTful 서비스의 컨트롤러와 "통신"하기 위해 해당 라인을 따라 객체 또는 무언가를 사용하여 전달되는 데이터를 얻습니다. , 해당 데이터를 다시보기 (Javascript, JSP 등)로 전달하여 표시하십시오.

내가 올바른 길을 가고 있습니까? RESTful 서비스에 대한 인증 측면도 있지만 아직 개념적으로는 없지만 프로젝트는 개인 네트워크에서 사용되므로 보안은 우선 순위가 아닙니다.

통찰력, 비판, 지식, 피드백 또는 설명은 대단히 감사합니다.

답변:


19

다음은 스프링 레스트 앱의 구조에 대한 내가 가장 좋아하는 시작 예 중 하나입니다.

1. 층 분리, 각 층은 개별 모듈 / 프로젝트

  • REST API
    • 전쟁으로 패키지 ( 내장 서버와 함께 스프링 부트 를 사용하는 경우 jar 가 될 수 있습니다 . 스프링 부트 문서는 소위 uber jar 를 배포하는 방법을 명확하게 설명합니다 . 매우 간단합니다.)
    • 요청 / 응답을 처리하는 나머지 컨트롤러가 있습니다.
    • 아래의 서비스 모듈 에 따라 다름
  • 서비스
    • 병으로 포장
    • 비즈니스 로직 추상화,이 계층은 데이터 소스와 통신하는 방법을 모릅니다.
    • 그것은됩니다 autowire가 나머지 컨트롤러에
    • 아래 DAO / 리포지토리 모듈 에 따라 다름
  • DAO / 리포지토리
    • 병으로 포장
    • 데이터 소스와 직접 대화하며 일반적으로 CRUD라고 알려진 작업이 있습니다. 단순한 jdbc, JPA 또는 파일 액세스 일 수 있습니다.
    • 아래 도메인 모듈 에 따라 다름
  • 도메인
    • 병으로 포장
    • 도메인 모델, 일반적으로 POJO 클래스가 있습니다. ORM을 사용하는 경우 ORM 엔티티입니다.
    • 또한 여전히 논쟁의 여지가있는 DTO (Data Transfer Object)를 가질 수 있습니다. 사용 여부는 전화입니다.
  • 유틸리티, 타사 통합 등과 같은 더 많은 모듈을 추가 할 수 있지만 위와 같은 것이 좋습니다.

2. 빌드 / 종속성 관리 도구 (매우 필요한 IMHO)

그들 중 많은 것이 있습니다, 구글 검색이 당신을 보여줄 것입니다. 나는 개인적 으로 Spring과 함께 Maven 을 좋아한다 . 단순히 위의 프로젝트 구조에서 작동합니다.
또한 maven을 사용하는 경우 섹션 1에서 설명한 모든 모듈을 집계하는 상위 모듈이 있습니다. 모든 글 머리 기호 모듈은 maven 모듈에도 해당합니다.

3. 특정 프로젝트에 대한 생각

REST를 사용하고 있으므로 JSP를 뷰로 사용하지 않는 것이 좋습니다. 일반 HTML5 + Javascript 또는 AngularJS와 같은 인기있는 프레임 워크를 뷰로 사용할 수 있습니다.
JSP 사용을 고집하는 경우 컨트롤러와 JSP가있는 다른 전쟁 (웹 앱)을 도입해야 합니다. Controller는 데이터 (일반적으로 Json / xml 형식)를 가져온 다음 JSP가 컨트롤러에서 가져 와서 표시 할 수 있도록 모델 (POJO)로 구문 분석합니다. JSP에서 데이터를 게시하는 것은 그 반대입니다.

이 주제는 상당히 크며 특정 요구 사항에 크게 의존하기 때문에 완전한 가이드에 가까운 것은 아니지만 여기에 포함 된 용어는 추가 연구를 수행하기에 충분합니다 (Google, it is). 바라건대 이것은 접근 방법에 대한 아이디어를 줄 것입니다.


1
도메인은 일반적으로 비즈니스 로직을 포함하는 계층입니다. 도메인은 일반적으로 서비스를 포함하는 계층이라고도합니다. 도메인 오브젝트는 일반 POJO가 아니며 도메인 오브젝트는 인수 유효성 검증과 같은 비즈니스 로직을 포함해야합니다. 레이어 이름을 다른 것으로 바꾸는 것이 좋습니다. 리포지토리 레이어는 여러 소스에서 도메인 개체로 데이터를 전송하는데도 자주 사용됩니다.
Andy

서비스 및 리포지토리 모듈도 Spring 프로젝트입니까?
Glenn Van Schil

1
@GlennVanSchil 아니오, 전체 프로젝트가 빌드 될 때 Spring 프로젝트가 b / c 일 필요는 없으며 repo / service 레이어가 클래스 경로에 포함됩니다. 는 @Autowire결과로 작동합니다.
Minjun Yu

@MinjunYu 명확한 답변 주셔서 감사합니다! 그러나 서비스, 리포지토리 또는 구성 요소 주석에 대한 maven 종속성으로 리포 지 / 서비스가 필요합니다.
Glenn Van Schil

1
@GlennVanSchil 모든 스프링 메이븐 종속성을 부모 모듈의 pom.xml에 넣으면 자식 모듈 (리포지토리 / 서비스 모듈)에 스프링 관련 종속성을 추가 할 필요가 없습니다. 이것은 봄에 여러 모듈 프로젝트를 레이아웃하는 한 가지 방법입니다. 목적은 코드를 구성하는 것입니다. 프로젝트가 그렇게 크지 않고 가까운 미래에 변경되지 않을 경우 "core"라는 동일한 모듈에서 도메인, 저장소, 서비스를 결합 할 수 있습니다. 더 깨끗해 보입니다.
Minjun Yu

2

@ Minjun.Y의 답변 대부분에 동의하지만 REST 및 웹 페이지 계층에 대해 약간 다른 접근 방식을 취할 것이라고 생각합니다. 귀하의 질문을 읽은 결과 웹 인터페이스와 REST 인터페이스를 모두 외부 세계에 노출하려고한다고 생각합니다. 데이터베이스에서 POJO를 읽고 데이터를 JSON으로 전환 한 다음 다시 JSP에서 사용하기 위해 POJO로 다시 가져와 얻는 것이 거의 없습니다.

서비스 계층에서 모든 실제 작업을 수행하고 웹 애플리케이션 (JSP) 및 REST 컨트롤러에 대해 별도의 "프레젠테이션"계층을 추가하는 것이 좋습니다. 이들은 서비스가 주입되는 별도의 컨트롤러입니다. 또는 REST 서비스 만 사용하여 이전 답변에 따라 클라이언트 측에서 모든 프리젠 테이션 로직을 빌드하십시오.

또한, 나는 Maven 모듈을 좋아하지 않습니다. Java 상점에서 프로젝트를 구현하는 방법은 서비스 계층을 정기적으로 릴리스 한 다음 프리젠 테이션 계층을 최신 릴리스에 종속시키는 것입니다. 이에 대한 논의의 여지가 있지만 그것은 확실히 우리에게 효과적입니다. 웹 인터페이스와 REST 인터페이스는 일반적으로 서로 다른 .war 파일에 있으므로 별도의 배포가 필요하므로 별도의 Maven 프로젝트로 구성됩니다.

BTW, 빌드 및 종속성 관리 도구를 사용하여 속도를 높일 필요성을 강화할 것입니다. 프로젝트가 적당한 크기로 성장하면 필요합니다. Maven, Jenkins 및 Nexus와 같은 무료 도구를 사용하면 릴리스 관리에 문제가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.