spring boot 를 사용하여 api 만들기

2024. 3. 19. 14:41Spring 백엔드 개발

SMALL

스프링에 대한 기본 지식이 없어 극기초부터 진행하며 개념도 틈틈히 정리할 예정이다.

 

1. 프로젝트 생성

2. build.gradle 설정

3. application.yml 설정

4. controller 패키지 생성

5. service 패키지 생성

6. dao, dto 패키지 생성

7. xml 파일 생성


1. 프로젝트 생성

intellij 를 사용하여  spring boot project 를 생성한다. 

Spring Initializr 프로젝트 생성

파일 이름을 알아서 만들면 되고 왼쪽 사이드바에서 Spring Initializr 을 꼭 선택하고 생성해야한다.

그리고 'next' 를 누르고 넘어간다.

의존성 선택

위의 화면에서 본인의 선택이지만 일반적으로 웹 서버를 이용하고 annotation 을 이용해서 코드를 줄일 수 있는 lombok 도 설치해주면 좋다.

2. build.gradle 설정

프로젝트를 생성한 후 가장 먼저 수정하는 것이 좋다.

dbeaver 를 이용하여 데이터베이스 & 테이블을 생성한 이후 진행한다.

mysql 을 이용하여 테이블을 생성한 후 프로젝트에서 사용할 예정이다. 따라서 mysql 의존성을 주입해야한다.

또한 mybatis 를 이용하여 sql 문을 편리하게 작성할 예정이다.

이를 위해 build.gradle 파일에 다음 코드를 넣어준다. 

dependencies {
    // spring web 연결 설정
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // mybatis 연결 설정
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
    // mysql 연결 설정
    runtimeOnly 'com.mysql:mysql-connector-j'
    // lombok 사용 연결 설정 & annotation 사용
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
}

 

그리고 작성한 후 꼭 옆의 코끼리 모양을 눌러 줘야한다. 

오른쪽 사이드를 보면 보통 나타나는데 위의 사진에서 위에서 4번째인 코끼리 닮은 아이를 눌러주어 새로고침을 진행해야한다.

이 과정을 진행하지 않으면 새롭게 라이브러리가 설치되지 않아 오류가 날 것이다.

 

3. application.yml 

일반적으로 application.properties 로 저장되어 있는 파일이 많다.

/src/main/resource 경로를 타고 들어가면 나오는 파일이다.

여기서는 본인이 사용할 port 와 db 정보를 설정해주면 된다. 

server:
  port: [원하는 port 번호] || 8000
spring:
  mvc:
    charset: UTF-8
  datasource:
  	# mysql 을 jdbc 를 이용하여 연결
    driver-class-name: com.mysql.cj.jdbc.Driver
    # jdbc:mysql://localhost:[mysql port || 3306]/[생성한 db명]?serverTimezone=Asia/Seoul&character_set_server=utf8mb4&collation-server=utf8mb4_general_ci&allowMultiQueries=true
    url: jdbc:mysql://localhost:3306/tpdms?serverTimezone=Asia/Seoul&character_set_server=utf8mb4&collation-server=utf8mb4_general_ci&allowMultiQueries=true
    #user를 찾을 수 없을 때
    # use mysql;
    # select user from user;
    username: [유저 이름]
    password: [비밀번호]
    tomcat:
      uri-encoding: UTF-8
  devtools:
    restart:
      enabled: true

mybatis:
  mapper-locations: /mybatis/mapper/*.xml

자신이 사용할 port 번호를 설정해주면 되고 본인의 ip 주소와 사용할 db 명을 url 안에 작성해준다. 

작성 후 데이터베이스 개인 정보인 유저 이름과 비밀번호를 작성한다. 

이 과정에서 유저 이름을 찾을 수 없으면 mysql command ~~~ 에서 주석처리된 sql 문을 치면 나온다.

 

4. controller 패키지 생성

이제 spring 의 기본인 MVC 모델로 파일을 나눠 개발할 예정이다. model, view, controller 로 나누지만 view 는 추후의 react 에서 구현할 예정이므로 controller, model 를 만들 것이다. 

파일구조

파일구조는 위의 사진으로 나타나고 각 패키지 내에 각각의 파일을 생성한다. 

먼저 contorller 패키지에는 BoardController 클래스를 생성한다. 

controller 는 client 가 요청을 보낼 때 가장 먼저 도착하는 파일이다. api 를 통해서 요청을 보낼 시 가장 먼저 도착하기에 api 의 형태를 결정할 수도 있는 부분이다. 

package com.example.board.controller;

import com.example.board.dto.Board;
import com.example.board.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping(value = "/Board")
public class BoardController {

    @Autowired
    BoardService boardService;

    // GET: 데이터 가져오기
    @RequestMapping(value = "/List", method = RequestMethod.GET)
    public ResponseEntity<?> getBoardList (@RequestParam(value = "num", required = false) Integer num) {
        List<Board> result = boardService.getBoardList(num);
        return new ResponseEntity<>(result, HttpStatus.OK);
    }
}

Annotation(@)
: 코드 사이에 특별한 의미, 기능을 수행하도록 하는 기술로 프로그램에 관한 데이터를 제공하며 코드에 정보를 추가
: 프로그램에서 추가적인 정보를 제공해주는 메타데이터
: 코드 작성 문법 에러를 체크 
: 코드를 자동으로 생성할 수 있음
: 런타임 시 특정 기능을 실행하도록 정보 제공

@component
: 개발자가 직접 작성한 class 를 bean으로 등록하기 위한 annotation

@Controller
: 화면 (view) 를 반환하기 위해 사용한다. 
: 클래스가 controller 역할을 한다고 명시하기 위해 사용

@RestController
: view 가 필요없는 API 만 지원하는 서비스에서 사용

@RequestMapping
: @RequestMapping(value="") 형식으로 요청이 들어온 URI와 value 값이 일치할 때 해당 메소드 실행
: http://localhost:3000/mapping
: 'mapping' 부분이 일치하는 경우 아래의 메소드 실행

@RequestParam
: @RequestParam(value = "name", required=true || false) String name
: 요청이 들어왔을 때 name 으로 바인딩 된다.
: required 는 필수로 들어와야하는 값인지 아닌지를 정할 수 있음.
: ex) http://localhost:3000/A/name=AAA
: name 이 바인딩되어 여기서 String name = AAA 가 된다.

@Autowired
: 필드, setter, 메소드, 생성자에서 사용하며 type에 따라 자동으로 bean을 주입

Abc abc = new Abc();
// annotation 삽입 후
@Autowired
Abc abc;

: 해당하는 bean이 없거나 2개 이상 존재하는 경우 예외 발생
: 즉, bean 은 길잡이 같은 역할로 어느 방향으로 향할 것을 정해주는데 그 화살표를 정할 수 없는 경우 예외 발생

++ 코드 외의 추가적인 부분

@Getmapping
== @RequestMapping(Method = RequestMethod.GET)
ex) @GetMapping(value="/path") = @RequestMapping(value = "/path",  Method = RequestMethod.GET)

5. service 패키지 생성

controller 파일처럼 패키지 생성 후 service 클래스를 생성

package com.example.board.service;

import com.example.board.dao.BoardRepository;
import com.example.board.dto.Board;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BoardService {
    @Autowired
    BoardRepository boardRepository;

    // GET: 데이터 가져오기
    public List<Board> getBoardList(Integer num) { return  boardRepository.getBoardList(num);}
}

 

@Service
: 비즈니스 로직이나 service 레이어 클래스들에 사용
: 클래스가 서비스 역할을 한다고 명시하기 위해 사용

6. dao 패키지 생성

동일하게 dao 패키지를 생성한 후 repository interface 를 생성한다. 

class 가 아닌 interface 를 생성한다. 

DAO : Data Acess Object
: DB를 사용해 데이터를 조회하거나 조작하는 기능을 담당하는 것들
: DB 전용 객체로 사용

package com.example.board.dao;

import com.example.board.dto.Board;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface BoardRepository {

    // GET: 데이터 가져오기
    List<Board> getBoardList(@Param("num") Integer num);

}

@Repository 
: Repository 로 데이터 접근 가능하다는 정보를 알려줌
: bean 에 자동으로 등록해주는 기능도 있음
: 즉 Repository -> DB 로 연결

@Mapper
: 마커 인터페이스로 무언가 표시를 하기 위한 인터페이스이다.

 

7. dto 패키지 생성

동일하게 DTO 패키지를 생성한 후  클래스 파일을 생성한다. 

DTO : (Data Transfer Object)
: VO(Value Object) 라고도 표현
: 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말함
: 로직이 없고 일반적으로 Data 에 접근하기 위한 Data 형식을 나타냄

package com.example.board.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Board {
        Integer ID;
        String TITLE;
        String TEXT;
        String INPT_DATE;
}

@Getter, @Setter
: 데이터를 주고 받을 수 있는 getter와 setter 을 자동으로 코드로 작성해주는 annotaion 으로 코드의 간결성을 보장
: 가독성 또한 높아짐

 

@AllArgsContructor
: 모든 필드 값을 파라미터로 받는 기본 생성자를 생성해줌

@NoArgsConstructor 
: 아무 필드 값도 파라미터로 받지 않는 기본 생성자를 생성해줌 

++ 
@RequiredArgsConstructor
: final || @NonNull 인 필드 값만 파라미터로 받는 생성자 생성

 

8.xml 파일 생성

DB에서 데이터를 가져오는 SQL 문을 작성하는 파일이다. 

파일 구조는 resource 패키지 안에 위치하고 있다. 

해당 xml 파일의 위치는 위의 application.yml 에서 설정했던 mybatis 의 경로와 일치해야한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
// repository 의 mapper annotation 을 이용하여 매핑
<mapper namespace="com.example.board.dao.BoardRepository">
	// 여기서 resultType 은 해당 테이블의 데이터 형식이 적혀있는 DTO 파일을 말함
    <select id="getBoardList" resultType="com.example.board.dto.Board">
        SELECT A.ID
             , A.TITLE
             , A.TEXT
        FROM MYBOARD A
        WHERE 1 = 1
          AND A.ID =  CASE WHEN #{num} IS NULL THEN A.ID
                            ELSE #{num}
            END;
    </select>
</mapper>

여기서는 get 함수로 데이터를 가져오도록하기에 id 에 맞게 데이터를 가져오는 SQL 문을 작성한다. 


작성을 완료한 후 프론트 파일이 없다면 postman 을 이용해서 api 연결 결과를 확인할 수 있다. 

"http://localhost:{본인이 설정한 port}/Board/List" 로 연결해서 GET 메소드를 이용해서 테스트해볼 수 있다. 

연결 결과

위같은 json 형태로 연결된 상태를 확인할 수 있다. 

반응형
LIST

'Spring 백엔드 개발' 카테고리의 다른 글

spring 과 spring boot 의 차이점  (0) 2024.03.13