본문 바로가기
💊 Java/--- SpringBoot

[Springboot] IntelliJ를 이용하여 Springboot + Mysql + Jpa + Lombok 프로젝트 Setup 후 Rest API 서버 CRUD 테스트 (MacOS)

by Wonit 2020. 8. 27.

본 글은 Springboot와 Mysql + Jpa + Lombok 프로젝트를 구성하는 방법에 대해서 작성한 글입니다.

해당 블로그에 존재하는 모든 Springboot + Jpa 관련 글은 이 글에 존재하는 내용을 전제로 합니다.


순서

  1. Springboot Project 생성
  2. Gradle 의존성 추가
  3. application.properties 설정
  4. db table 생성
  5. Lombok 설정
  6. 코드 구현 (model, controller, repository 레포지토리 생성)
  7. CRUD 테스트

순서는 IntelliJ IDE가 깔려있다는 전제 하에 진행된다.

Springboot Project 생성

우리는 Springboot 프로젝트를 이용해서 JPA를 테스트할 것이므로 Springboot 프로젝트를 생성한다.


직접 Springboot 페이지에서 생성할 수도 있지만 우리는 IDE 자체의 Spring Initializer을 통해서 생성한다.

'

설정은 간단하게

- Spring Web

- Mysql Driver

- Spring Data JPA

- Lombok

 

만 추가해준다.

그럼 다음과 같은 기본 프로젝트가 나타나게 된다.

Gradle 의존성 추가

Gradle은 의존성을 관리해주는 도구인데 우리가 기본적으로 프로젝트를 생성할 시점에 필요한 의존성을 모두 추가했기 때문에 지금은 딱히 설정할 파일이 없지만 앞으로 필요한 모든 의존성을 이 build.gradle 파일에서 추가할 수 있다.

 

혹시 모르니 오른쪽 gradle 탭에서 reimport를 시켜준다.

applictation.properties 파일 설정

applictation.properties에는 코드의 제약 사항 및 database 설정과 JUnit 설정, 등등 다양한 설정의 Format으로 사용될 수 있다.

 

이번에는 우린 Mysql만 설정할 것이므로 Mysql 설정을 추가해주도록 한다.

 

Mysql 설정에 필요한 변수들은 다음과 같다.

  1. spring.datasource.url : 데이터베이스 url
  2. spring.datasource.username : 데이터베이스 username 아마 default로 root가 설정되어있지 않을까 싶다.
  3. spring.datasource.password : 데이터베이스 password
  4. spring.datasource.driver-class-name : 드라이버 정보

나머지는 필수 설정까진 아니고 있으면 좋은 설정이니 필요에 따라 검색해서 설정하길 바란다.

DB 테이블 설정

이제 mysql workbench로 들어가서 테이블을 만들어보자.


mysql workbench가 없다면 간단한 내용이니 겁먹지 말고 구글링 해서 깔아보도록 하자.

 

mysql workbench에서 테스트 용도인 user테이블을 만들어보자.

create table에서 User라는 이름의 테이블에 Id, username, password 만 추가해보자.

Lombok 설정

롬복을 사용하기 위해 플러그인을 설치하고 환경 설정에서 Enable Annotation Process를 체크하도록 하자.

그리고 환경설정에서 Enable Annotation Processing을 체크해주자

이제 프로젝트 환경 설정에 대해서는 모든 준비가 끝났다.

 

Rest Api를 작성하는 일만 남았다!


코드 구현

다음과 같이 DemoApplication이 존재하는 디렉토리에 3개의 패키지를 만들어 주자.

controller.package

컨트롤러라고 하는 서버에 엔트리 포인트와 엔드 포인트를 작성할 클래스이다.


추후에 JPA를 더 배우고 웹 서버 구조에 대해서 더 공부하면 알겠지만 해당 서비스 로직은 Service 패키지에서 관리한 클래스를 Autowired하여 서비스 로직을 작성한다.


하지만 우리는 간단한 CRUD 테스트이므로 단순히 컨트롤러만 작성해보도록 하자.

UserController.class 생성

UserController로 컨트롤러가 잘 동작하는지 테스트를 해보자.

 

UserController를 controller 패키지 하위에 생성하고 다음과 같은 코드를 작성해보자.

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @GetMapping("/get")
    public String getTest() {
        return "success";
    }
}
  • RestController

    일반적인 Controller와는 다르게 동작한다. 핵심은 우리가 Controller로 페이지를 return하는게 아니라 Data(JSON)을 return하는 것이다. 정확히는 ResponseBody를 반환하지만 현재 시점에선 쉽게 데이터를 반환한다고 생각해도 무방하다.

  • @GetMapping("")

    "" 안에 들어갈 URL로 GET 요청을 받을 수 있게 해주는 어노테이션이다. 이 어노테이션은 @RequestMapping에 get 메서드를 추가한 것과 같은 역할을 수행한다.

그리고 localhost:8080/get 이라는 경로를 웹 브라우저를 통해서 들어가면 다음과 같이 성공적으로 동작한 것을 알 수 있다.

model.package

데이터 관련 Object가 들어갈 패키지 이다.


이 부분도 추후에 DAO, DTO, VO로 나눠서 관리하기도 하고 DAO, DTO로도 관리하기도 한다.


일단은 우리는 단순 DAO 객체만 만들어보자.


자세한 사항은 구글링을 통해 알아보는 방법도 좋은 학습법이다.

User.class 생성

package com.example.demo.model;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;
}

해당 클래스는 데이터베이스와 실제 매칭되는 역할을 하는 클래스이다.

  • @Entity

    데이터베이스와 연결된 객체를 Entity로 지정한다는 어노테이션이다. 우리가 Entity로 만들어야지 Repository에서 Entity를 가지고 쉽게 쿼리문을 사용할 수 있게 해준다.

  • @Data

    롬복의 어노테이션으로 Getter과 Setter를 직접 구현하지 않아도 사용할 수 있게 해주는 어노테이션이다.

  • @Id

    데이터베이스에 Primary Key에 해당하는 칼럼을 지정하는 어노테이션이다. 만약 우리가 아이디를 지정하지 않으면 오류가 난다.

  • @GeneratedValue(strategy = GenerationType.IDENTITY)

    Id의 스트레터지를 지정하는 것인데 쉽게 말 해서 IDENETY를 설정하면 DB의 AutoIncreament를 사용할 수 있다.

repository.package

JPA가 기본적으로 쿼리문을 ORM으로 관리할 수 있는 패키지이다.


우리는 JpaRepository라는 인터페이스를 사용해서 구현할 것이다.

UserRepository.interface 생성

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

}
  • JpaRepository<Entity, Type>

    JpaRepository로 사용할 수 있게 지정해주는 어노테이션으로 제네릭 타입 안에는 Entity 클래스와 해당 클래스의 Id 타입이 들어간다.

CRUD 테스트

Controller 작성

이제 모든 셋업이 끝났으므로 다시 Controller로 돌아가서 실제 통신으로 우리가 작성한 코드가 잘 동작하는지 확인해보자.

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
@RequestMapping("/api")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @PostMapping("/user")
    public User create(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/user/{id}")
    public String read(@PathVariable Long id) {

        Optional<User> userOptional = userRepository.findById(id);
        userOptional.ifPresent(System.out::println);

        return "successfully executed";
    }
}

Api Tester로 테스트

create 메서드 실행

create 메서드는 Controller에서 매핑하길 localhost:8080/api/user 로 하였으므로 해당 URL에 JSON 파라미터를 넘겨보자.


간단하게 여기서 말 하는 JSON 파라미터는 우리가 RequestBody로 받는 User의 객체인 Key:value 형태로 값이 넘어오는 것을 뜻한다.


JSON은 웹 개발을 할 때는 중요한 내용중 하나이므로 꼭꼭 다른 방식으로라도 학습을 해보길 권장한다.

정상적으로 잘 실행되는 것을 볼 수 있다.

read 메서드 실행

read메서드는 Controller에서 매핑을 하길 localhost:8080/api/user/{id}로 하였으므로 해당 URL로 들어가보자.

정상적으로 잘 실행되는 것을 볼 수 있다.

 

 

이렇게 오늘은 IntelliJ에서 스프링부트 + 데이터베이스(Mysql) + 롬복을 연결하여 웹 통신에 대해 간접적으로 알아보았다.

글의 설명에는 Spring의 진입 장벽을 낮추기 위한 많은 비약이 존재하는데, 어려운 내용은 꾸준히 구글링을 통해 채워나가는 학습 방법을 권장한다.

화이팅!

댓글3