본문 바로가기
3.1SpringBoot/3.1.2 묘공단 SpirngBoot3

[묘공단/spring] 3장 Spring boot 3 구조

by Dohi._. 2023. 9. 21.

 

포스팅 목차  (책의 목차와 다릅니다 개인적으로 공부한 내용입니다)

3장

  3-1. 계층 <프레젠테이션,비지니스, 퍼시스턴스>

  3-2. 디렉터리

  3-3. Spring boot 요청-응답

  3-4. 3장 실습 + 디테일 개념 <DTO, VO, DAO, Domain>

 

3-1. 계층

계층은 각자의 역할과 책임이 있는 어떤 소프트웨어의 구성요소를 의미합니다

그리고 각 계층은 서로 소통할 수 있지만 다른 계층에 직접 간섭하거나 영향을 미치지는 않습니다

 

스프링 부트는 다음 그림에서 보듯 각 계층이 양 옆의 계층과 통신하는 구조를 따릅니다

 

이 계층이 서로 통신하며 프로그램을 구성합니다

 

프레젠테이션 계층

HTTP 요청을 받고 이 요청을 비지니스 계층으로 전송하는 역할을 합니다.

이전 포스팅에서 본 TestController와 같은 컨트롤러가 바로 프레젠테이션 계층의 역할을 합니다.

 

비지니스 계층

모든 비지니스 로직을 처리하는 계층입니다

비지니스 로직은 서비스를 만들기 위한 로직을 뜻합니다

 

퍼시스턴스 계층

모든 DB(데이터베이스) 관련 로직을 처리하는 곳으로써 이과정에서 DB에 접근하는 DAO객체를 사용할 수도 있습니다.

 

위에 그림에서 컨트롤러와 서비스와 리포지토리는 계층이라는 개념의 영역을 실제 구현을위한 영역입니다

차이를 간단하게만 이해하고 차차 알아가면 좋을 것 같습니다.

 

3-2. 디렉터리

스프링 부트 디렉터리를 간단하게 알아가보려고 합니다 

 

- main

실제 코드를 작성하는 공간으로 프로젝트 실행에 필요한 소스 코드,리소스 파일 등등

모두 main 디렉터리 안에 들어 있습니다

main 디렉터리는 java와 resources 디렉터리로 구성되어 있다

  • java - 소스코드를 저장
  • resources - 내부에 static, templates,application.yml으로 구성되어 있으며 
    • static에는 js,css,image와 같은 정적 파일을 넣을때 사용한다
    • application.yml는 스프링 부트 설정을 할 수 있는 파일이며 스프링 부트 서버가 실행되면 자동 로딩되는 파일

- test 

프로젝트의 소스 코드를 테스트를 할 목적의 코드나 리소스 파일이 들어 있는 곳입니다

 

- build.gradle

빌드를 설정하는 파일 

해당 파일에서 의존성이나 플러그인 설정등 과 같이 빌드에 필요한 설정을 할때 사용합니다

 

- setting.gradle

빌드할 프로젝트의 정보를 설정하는 파일입니다

 

3-3. Spring boot 요청-응답 요약

HTTP요청이 오면 어떤 과정을 거치며 실행되고 응답하는지 간단하게 알아보겠습니다.

1. 클라이언트에서 톰캣에 /test get 요청

2. 스프링 부트 내로 이동후 디스패처 서블릿이 URL를 분석후 요청 처리 가능한 컨트롤러를 찾습니다 

3. 해당 컨트롤러가 매칭한 메서드 (/test get 요청 처리가능)이 요청처리 

4. 뷰 리졸버는 템플릿 엔진을 이용해서 HTML혹은 JSON,XML등의 데이터를 생성합니다

5. 결과를 리턴해서 클라이언트에서 볼 수 있게 됩니다

 

3-4. 3장 실습 + 디테일 개념  <DTO, VO, DAO, Domain>

SpringBoot파일을 저는 주로 Spring.io를 이용해서 생성을 합니다. 

Spirng.io를 잘 모르겠다면!
0.Spring Start(JDK설치,IDE설치,spring.io)편에 생성하는 법이 있으니 참고 부탁드립니다.

 

일단 Spring.io에서 의존성을 선택을 했다면 의존성은 일단 추가 되어 있지만

추가적으로 필요한 의존성을 추가해야할 경우를 가정하고 의존성 추가하는 방법부터 알아보겠습니다.

 

1. 의존성 추가하기

위에서 설명한 구조에서 빌드를 설정하는 파일인 build.gradle에 필요한 의존성을 추가를 합니다.

dependcies에 필요한 것들을 추가해주시면 됩니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'io.jsonwebtoken:jjwt:0.9.1'
    implementation 'javax.xml.bind:jaxb-api:2.3.1'
    implementation 'mysql:mysql-connector-java'

    runtimeOnly 'com.h2database:h2'// 인메모리 데이터베이스 H2

    compileOnly 'org.projectlombok:lombok'// Lombok
    annotationProcessor 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'

    testImplementation 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

 

 

의존성을 추가한후에는 추가한 의존성을 다운로드 하여

적용하기 위해 오른쪽에 있는 Gradle탭에서

새로고침 버튼을 누르면 앞서 추가한 의존성을

다운로드 할수 있습니다.

 

 

 

2.계층 구성 

위에서 계층에 대해서 알아봤습니다

프레젠테이션 계층에 속하는 Controller를 우선 작성을 해봅니다

@RestController //@Controller(컨트롤러선언) + @Responebody  
public class TrainingController {

    @Autowired// TrainingService 빈 주입 
    TrainingService traingingService;

    @GetMapping("/test")//주소 /test에 매핑 
    public List<Member> getAllMembers() {
        List<Member> members = trainingService.getAllMembers();
        return members;
    }
}

 그다음에 작업을 수행하는 비지니스 로직을 담당하는 Service를 만들어 봅시다 

 

@Service 
public class TrainingService{
	
    @Autowired
    MemberRepository memberRepository;
    
    public List<Member> getAllMembers(){
    	return memberRepository.findAll();
     }

 

해당 서비스에는  비지니스로직은 getAllMembers()이 있는데 해당 memberRepository에서 member의 list를 얻는 메서드입니다 

 

퍼시스턴스 계층에는 Repository가 있는데 그전에 데이터 관련된 객체 4가지를 먼저 알아가고자 합니다 

  • DAO(데이터 엑세스 객체/ Data Access Object) 
    • 위에서 언급한번 했던 객체인데 DB와의 상호작용을 관리하고 DB에서 데이터를 읽기위해 사용됩니다.
    • 즉, Repository로 실제로 DB에 접근하여 CRUD하는 객체로 Service와 DB를 연결해주는 역할까지 합니다.
    • Repository와 정확하게 따지면 조금 다른 개념이긴 하지만 DAL(DB관련 정보를 처리하는 계층/Data Access Layer)의 구현체인 것은 같다. 이후 포스팅에는 주로Repository로 설명할 예정이다.

 

  • DTO(데이터 전송 객체 / Data Tranfer Object)
    • 데이터를 전송하거나 전달하기 위해서 사용되는 객체이며 Getter,Setter 메서드만 존재합니다.
    • DB에서 데이터를 받고 Service이나 Controller등으로 넘겨줍니다.
    • 즉, 로직은 보유하지 않은 DB에서 받을 데이터방식 정의혹은 데이터 객체입니다.
    • VO(Value Object)와 혼용 되기도 합니다만 크게 VO는 불변객체, DTO는 가변 객체라는 차이점이 있습니다

 

  • VO(Value Object)
    • VO는 불편객체의 개념으로 Read-Only을 의미합니다 
    • Getter/Setter가 둘다 존재하는 DTO와 달리 VO는 Setter만 존재합니다.
    • 즉, DTO는 Layer간의 데이터가 오고 가고 하는 객체 , VO는 특정한 값을 담는 객체라고 생각하면 편합니다 

 

  • Domain(Entity)
    • 실제 DB의 테이블과 매핑되는 객체이다.
    • @Entity 애너테이션을 이용하여 DB테이블과 매칭되는 클래스임을 나타낸다.

 

가끔 어떤 설명에는 DTO와 domain을 합쳐서 설명하기도 한다.
DTO역할을 domain에 합쳐 버리는 경우도 있기 때문이다.

 

 

언제 이개념이 쓰는지 글로만 보면 어렵기 때문에 그림을 통해 이해하면 좀 수월 할 듯 합니다.

 

 

아래 코드는 domain과 Repository를 예시로 들어낸 코드입니다.

@NoArgsConstructor(access = AccessLevel.PROTECTED) //기본생성자 생성
@AllArgsConstructor//모든 파라미터를 가지는 생성자
@Getter//Lombok의 애너테이선
@Entity //이 클래스는 이제 엔티티입니다.라는 의미
public class Member{

	@Id//이게 id다!
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)//id와 매칭
    private Long id;

    @Column(name = "nickname", nullable = false)
    private String name; //이러면 nickname에 매칭? 한번 해보세요!
    }
    
    
    //-----MemberRepository.java---- interface입니다!
 @Reposistory
 public interface MemberRepository extends JpaRepository<Member, Long>{
   }

 

 

추가적인 지식이 필요하다 싶으면1-3. 회원 관리 예제를 잠시 참고 부탁드립니다:)

 

 

 

 


이 글은 골든래빗 《스프링 부트 3 백엔드 개발자 되기 - 자바 편》의 3장 써머리입니다.

 

728x90

댓글