본문 바로가기
Back-End/JAVA

Spring 프로젝트 시작하기 - 구조설계 및 테스트편

by debugggggger 2024. 9. 25.

 

프로젝트 구성

프로젝트 구성에 관해서는 개인적인 분석으로, 크게 두가지로 분류된다.

 

1. 서비스를 대분류로 나누는 경우 ex) Member > Controller / Service ...

개발하는 웹페이지가 대메뉴-소메뉴 이상의 규모일때 사용하기에 좋았다.

예를들어서

A

- A.a

- A.b

- A.c

B

- B.a

- B.b

이런 메뉴구성을 가지는 경우는 A와 B의 파일이 섞이지 않도록 대분류로 나누는것이 좋다.

 

2. 클래스의 기능을 나누는 경우 ex) Controller / Service > Member ...

개발하는 프로젝트의 규모가 작을때는 Controller / Service가 많지 않기때문에 한번에 관리하는 경우가 더 간편했다.

 

나같은 경우에는 극소규모의 프로젝트라서 Controller와 Service는 한 폴더에서 관리하고,

DTO는 하나의 메뉴라고 해도 CRUD 로직이 들어가면 복잡하기 때문에 메뉴별로 소분류를 나누었다.

 

test는 Spring 프로젝트 생성시 알아서 만들어주며, 테스트코드는 모쪼록 부지런히 작성해주는것이 좋겠다.


Controller / Service 생성

package org.debugggggger.stock.java.io.core.api.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.HashMap;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class ChartService {

    public String chartService1(Map<String, Object> param) {
        String greeting = "Hello World";
        System.out.println(greeting);
        return greeting;
    }
}

Service를 콘솔로 찍고  리턴해주었다.

@Service 어노테이션은 잊지말고 필수로 달아두도록 하자.

@RequiredArgsConstructor 은 롬복의 기능으로, 생성자 의존성 주입을 자동으로 설정해준다.

 

 

package org.debugggggger.stock.java.io.core.api.controller;

import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.debugggggger.stock.java.io.core.api.service.ChartService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RequestMapping("/chart")
@RestController
@RequiredArgsConstructor
public class ChartController {

    private final ChartService chartService;

    /**
     * Chart 리스트 조회
     * @param request
     * @param param
     * @return
     *
     * GET /chart/list
     */
    @GetMapping("/list")
    public ResponseEntity<Map<String, Object>> selectChartList(HttpServletRequest request, @RequestParam Map<String, Object> param) {
        return ResponseEntity.ok(Map.of(
                "code", 200,
                "message", "OK",
                "body", chartService.chartService1(param)
        ));
    }
}

Controller도 만들어주었다.

 

@RequestMapping에는 접근할 경로를 넣어주면 되겠다.

 

이로써 가장 최소화된 구성은 갖춰졌다.

 


테스트

 

자고로 코드를 작성했으면 테스트라도 썰어야되는법.

내가 코드를 테스트하는 방식은 두가지가 있는데, POST MAN과 Test코드를 작성하는 법이다.

 

1. POST MAN 테스트

1. METHOD를 선택한다.

2. API URL을 입력한다. (변수설정을 안했으면 full 경로를 입력해도 되는데 port가 변경될때에는 많이 번거롭다.)

3. Query 파라미터가 필요한 경우에 작성한다.

4. POST 요청인 경우에 Body를 사용한다.

 

이렇게 요청을 보내면 body에 Hello Word가 찍히게 된다.

 

2. Test 코드 작성

package org.debugggggger.stock.Service.Chart;

import org.debugggggger.stock.java.io.core.api.common.dto.JwtTokenDto;
import org.debugggggger.stock.java.io.core.api.service.ChartService;
import org.debugggggger.stock.java.io.core.api.service.MemberService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Map;

@SpringBootTest
public class ChartServiceTest {
    @Autowired
    private final ChartService chartService;

    // 기본 생성자 추가
    public ChartServiceTest() {
        this.chartService = null; // 기본 생성자에서는 null로 초기화
    }

    @Test
    void contextLoads() {
        Map<String, Object> param = new HashMap<>();
        System.out.println(chartService.chartService1(param));
    }
}

어노테이션을 잊지말자.

 

contextLoads 함수의 왼쪽 실행버튼을 누르면 테스트코드가 실행된다.

 

 

로그에 Hello World가 두번 출력된것이 보인다. (Service에서 한번찍고 Test에서 한번 더찍었기 때문)

 

> Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

 

해당 사항으로 빨갛게 출력된것이 보이는데, 이는 intelliJ에서 자바를 사용할때 발생하는 경고여서 오류는 아니다.

거슬린다면 build.gradle 파일에서 다음을 추가하면 되겠다.

tasks.named('test') {
    useJUnitPlatform()
    jvmArgs '-Xshare:off' // JVM 아규먼트 설정
}

'Back-End > JAVA' 카테고리의 다른 글

Spring 프로젝트 시작하기 - 생성편  (0) 2024.09.24