대외활동/UMC SERVER

7주차 실습 - API 사용하기

Debin 2022. 4. 28.
반응형

 드디어 본격적으로 Spring Boot를 사용하기 시작했다. 툴은 인텔리제이를 사용한다.

본인은 아래 사이트에서 프로젝트를 생성하고 다운로드 받을 줄 알았는데 컴공선배 깃허브에 있는 레포를 다운받았다.

보통 웬만한 스프링 프로젝트는 아래 사이트에서 생성해서 다운로드 받는다.

https://start.spring.io/

 

이제 본격적으로 시작해보자.

우선은 이전 시간에 만든 우리의 RDS와 Spring Boot를 연동시켜야 한다.

Maven이 아닌 Gradle 프로젝트다.

따라서 application.yml 파일을 아래와 같이 작성하자.

server:
  port: 9000

spring:
  application:
    name: demo

  datasource:
    platform: mysql
    url: jdbc:mysql://RDS 엔드포인트
    username: admin
    password: 비밀번호
    #driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8버전
    driver-class-name: com.mysql.jdbc.Driver # mysql 5버전

PORT를 8080이 기본 값인데 9000으로 수정한 것과 application의 name이 데모라는 것을 알 수 있다.

중요한 부분은 바로 datasource다.

  • platform : 사용할 데이터베이스를 넣는다.
  • url : 우리가 생성하고 사용하는 RDS의 엔드 포인트를 넣어줘야 한다. 형식은 jdbc:mysql:://RDS 엔드포인트
  • username : 관리자 이름을 넣는다. 우리는 admin으로 만들었다.
  • password : 비밀번호를 입력한다.
  • drvier-class : 본인은 mysql 5버전으로 생략했으므로 com.mysql.jdbc.Driver을 사용한다.

우선 아래와 같은 API TEST를 위한 테스트 클래스가 있었다.

package com.example.demo.src.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    public TestController() {}

    /**
     * 로그 테스트 API
     * [GET] /test/log
     * @return String
     */
    @ResponseBody
    @GetMapping("/log")
    public String getAll() {
        System.out.println("테스트");
//        trace, debug 레벨은 Console X, 파일 로깅 X
//        logger.trace("TRACE Level 테스트");
//        logger.debug("DEBUG Level 테스트");

//        info 레벨은 Console 로깅 O, 파일 로깅 X
        logger.info("INFO Level 테스트");
//        warn 레벨은 Console 로깅 O, 파일 로깅 O
        logger.warn("Warn Level 테스트");
//        error 레벨은 Console 로깅 O, 파일 로깅 O (app.log 뿐만 아니라 error.log 에도 로깅 됨)
//        app.log 와 error.log 는 날짜가 바뀌면 자동으로 *.gz 으로 압축 백업됨
        logger.error("ERROR Level 테스트");

        return "Success Test";
    }
}

POSTMAN을 이용해서 우리의 스프링 서버와 RDS가 잘 연동되었는지 확인하자.

공식홈페이지는 아래이며 OS에 맞게 다운받으면 된다.

https://www.postman.com/

 

Postman API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

www.postman.com

아래와 같이 잘 작동하는 것을 확인할 수 있다.

테스트 성공(description은 무시하자. 이전에 작성한 api 요청의 흔적..)

그럼 이제 터미널을 열고 실습을 그대로 따라가보자.

아래 명령어로 build를 진행한다. 이 명령어는 빌드된 파일을 지웠다가 다시 빌드한다고 한다.

./gradlew clean build

성공적으로 build를 마쳤다. 꼭 DB랑 잘 연동이 되었는지 확인하고 진행하자.

build 완료

다음은 자바를 실행하자.

java -jar build/libs/demo-0.0.1-SHAPSHOT.jar

이 명령어가 무엇일까?? 일단 build 디렉터리에 어떤 .jar 파일이 생겼다. 이를 직접보고자 터미널로 들어갔는데 확인할 수 있었다.

일단 이 명령어를 사용하면 Spring이 돌아가면서 서버가 뜬다. 즉 자바 실행 명렁어라고 이해할 수 있겠다. 좀 더 정확한 정보가 궁금했다.

생성된 파일을 확인

1. .jar 파일이란 무엇인가

JAR는 여러개 의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다. 즉 자바 프로젝트를 압축한 파일이다.

 

2. java -jar build/libs/demo-0.0.1-SHAPSHOT.jar 용도가 무엇인가?

java - jar  [실행할 파일의 경로]. 즉 우리는 build 된 파일 demo-0.0.1-SHAPSHOT.jar를 실행시킨 것이다.

 

이제 위 명령어를 입력해보자. Spring이 동작하는 것을 확인할 수 있다. 혹시 모르니 POSTMAN 테스트까지 진행하자.

스프링 동작
테스트 성공

이제 API를 본격적으로 사용하기전에 테스트 DB를 만들어야 한다.

RDS에 접속하고 아래와 같이 입력하자.

CREATE DATABASE TEST; --데이터베이스 생성

USE TEST; --데이터베이스 접속

--유저 테이블 생성
CREATE TABLE User
(
    userIdx      INT             NOT NULL    AUTO_INCREMENT, 
    name         VARCHAR(45)     NOT NULL    COMMENT '유저 이름',
    nickName     VARCHAR(45)     NOT NULL    COMMENT '유저 닉네임', 
    phone        VARCHAR(45)     NOT NULL,
    email          VARCHAR(45)     NOT NULL,
    password     TEXT            NOT NULL,
     PRIMARY KEY (useridx)
);

--테스트 유저 생성
insert into User(name, nickName, phone, email, password) 
values ("bin","debin","010-1234-1234","1234@gmail.com","12341234");

 

이제부터 API와 스프링을 학습해보자. 우선 JDBC Template를 사용했다. 일단 테스트 유저를 조회했는데 성공적으로 조회했다.

 

API 사용

이렇게 API를 사용해보았다. API의 본격적인 작성은 다음 시간인 7주차 챌린지 과제 포스팅에 작성하겠다.

기억할 내용

jdbcTemplate.query vs jdbcTemplate.queryForObject

  • querForObject : 한 개의 객체를 리턴할 때만 사용한다.
  • query : 리스트로 반환

jdbcTemplate.queryForObject 함수

아래와 같은 메서드를 작성했다.

queryForObject는 인자로 무엇을 받을까?

  1. 첫 번째 인자 : 수행할 쿼리가 들어간다.
  2. 두 번째 인자 : RowMapper 익명 클래스가 들어간다. 이것을 람다식으로 교체했다. 
    역할은 select 구문으로 나온 데이터들을 어떤 형태로든지 변환시킨다.
    (람다식이 들어간걸로 보아 익명 클래스, 함수형 인터페이스가 들어오는 것을 알 수 있다.)
  3. 세 번째 인자 : SQL 치환 변수에 바인딩(교체) 될 값.
public User getUsersByIdxV2(int userIdx){
        String getUsersByIdxQuery = "select userIdx,name,nickName,email,phone, password from User where userIdx=?";
        int getUsersByIdxParams = userIdx;
        return this.jdbcTemplate.queryForObject(getUsersByIdxQuery,
                (rs, rowNum) -> new User(
                        rs.getInt("userIdx"),
                        rs.getString("name"),
                        rs.getString("nickName"),
                        rs.getString("email"),
                        rs.getString("phone"),
                        rs.getString("password")),
                getUsersByIdxParams);
    }

만약 값이 1개가 아니라 0이거나 2개 이상이라면 예외를 던진다.

  • 0일 경우 : EmptyResultDataAccessException
  • 2 이상일 경우 : IncorrectResultSizeDataAccessException

ResponseBody vs RestController

RestController = ResponseBody + Controller이다. 따라서 RestController에서는 ResponseBody를 안써도 된다.

 

PathVariable

PathVariable와 변수명이 동일하다면 생략 가능하다.

@GetMapping("/{userIdx}")
public BaseResponse<GetUserRes> getUserByIdx(@PathVariable("userIdx") int userIdx)

@GetMapping("/{userIdx}")
public BaseResponse<GetUserRes> getUserByIdx(@PathVariable int userIdx)

JDBC

  • JDBC Template에서는 삽입/수정/삭제는 update() 메서드를 사용한다.

 

이상으로 포스팅을 마치겠습니다. 감사합니다!

반응형

댓글