본문 바로가기
Spring Boot Project/Plming

[Plming] 개발 환경 세팅하기

by slchoi 2022. 3. 24.
728x90
SMALL

[개발 환경]

더보기
  • Windows 10
  • IDE: IntelliJ IDE 2021.3.2
  • SQL: MySQL 8.0.x
2022년 3월 16일 ~ 2022년 3월 21일까지는 상세 기능 명세서를 작성하고, 프런트엔드 파트와 공유할 REST API 문서 초안을 작성했다.

작성한 내용은 아래 링크에서 확인 가능하다.
    1. 상세 기능 명세서
    2. REST API 초안

백엔드 파트 스프린트에서 각자 개발할 파트를 나눴다. 나는 게시판 부분 개발을 진행하기로 하고, 다른 팀원은 DB 설계와 서버 개설, 사용자 관리(로그인, 회원 가입) 부분 개발을 진행해주시기로 하셨다.

아직 스프링을 자유자재로 다룰 수 있는 실력이 되지 않아 우선 수강하던 스프링 강의(인프런 김영한 님의 스프링 MVC 활용 1편)를 모두 들은 후 개발을 진행하기로 했다. 오늘부로 (2022년 3월 24일) 강의를 모두 수강해 게시판 개발을 시작했다.

1. Spring Boot Project 생성하기

처음 프로젝트 생성은 Spring Initializr를 통해 진행했다.

  • 프로젝트 선택
    • Project: Gradle Project
    • Language: Java
    • Spring Boot: 2.6.4
  • Project Metadata
    • Group: plming
    • Artifact: board
    • Name: board
    • Package name: plming.board
    • Packaging: Jar
    • Java: 11
  • Dependencies:
    • Developer Tools: Lombok, Spring Boot DevTools, Spring Configuration Processor
    • Template Engines: Thymeleaf
    • Web: Spring Web
    • SQL: Spring Data JPA, MyBatis Framework, MySQL Driver

 

2. 프로젝트 설정하기

빠른 빌드를 위해 빌드 환경을 변경했다.

빌드 환경 변경

  • File > Settings에서 Gradle 검색
    • Build and run using, Run tests using을 Gradle -> IntelliJ IDE로 변경
    • 변경해주면 빌드할 때 Gradle을 거치지 않기 때문에 빌도 속도가 빨라짐

Lombok 애노테이션을 사용하기 위해 설정을 변경했다.

Lombok 사용을 위한 설정 변경

  • File > Settings에서 Annotation Processor 검색
    • Enable annotation processing 옵션 활성화

 

3. 프로그램 빌드하기

프로그램 빌드 화면

아무 설정을 하지 않아 Error Page가 뜨지만, 정상적으로 빌드되는 것을 확인할 수 있다.

 

4. MySQL과 IntelliJ 연동하기

우선 MySQL 설치 페이지에서 맞는 버전을 다운로드하고 설치한다. root 비밀번호는 IntelliJ와 Connection 할 때 필요하므로 기억하기 쉬운 것으로 설정해야 한다.

그다음 Connector를 다운로드하여야 한다. (Connector 다운 페이지) 다운로드한 후 압축 파일을 적당한 곳에서 압축을 해제한다.

SQL 연동을 원하는 프로젝트를 IntelliJ에서 Open 한다.

IntelliJ page

오른쪽 위의 톱니바퀴를 클릭하면 Project Structure이 보인다.

Project Structure

Project Structure에 들어가서 Libraries를 클릭한 후 '+' 버튼을 눌러 Java를 선택한다.

Connector 압축 푼 폴더 구조

Connector를 다운은 압축 파일을 푼 폴더에서 "mysql-connector-java-버전. jar"를 선택한 후 OK를 눌러준다.

External Libraries

프로젝트의 외부 라이브러리(External Libraries)에 mysql이 추가되었다.

 

5. MySQL 설정

5.1. Connection 생성하기

MySQL Workbench를 실행하고, 상단의 '+'를 누르면 위와 같은 창이 나오고 정보를 입력한다.

  • Connection Name: 자유롭게 naming 하면 된다.
  • Hostname: 데이터베이스를 연결할 주소를 의미한다. 아직은 localhost에서 개발을 진행할 것이므로 Hostname에는 localhost 또는 127.0.0.1을 입력해야 한다.
  • Port: MySQL의 기본 포트 번호는 3306이다.
  • Username: MySQL을 설치하는 과정에서 입력했던 아이디를 의미한다.
  • Password: MySQL을 설치하는 과정에서 입력했던 비밀번호를 의미한다.
  • Default Scheme: 기본으로 사용할 스키마를 의미한다. 아직은 스키마를 생성하지 않았기 때문에 비워둔다.

 

 

각 정보를 모두 입력하고 나면 Test Connection을 클릭해 비밀번호를 입력해준 후 OK를 클릭하면 왼쪽과 같은 창이 열린다.

 

 

 

Connection이 생성된 결과

Connection이 생성된 결과는 위와 같다.

 

5.2. MySQL 스키마 생성하기

plming connection에 접속해 좌측의 SCHEMAS 영역의 빈 공간에서 마우스 오른쪽 버튼을 클릭해 Create Schema를 선택

Schema 생성

Name은 이전 프로젝트 이름과 동일하게 입력하고, Charset/Collation은 'utf8bm4', Default Collation으로 선택한 뒤 Apply 클릭

생성 결과

 

5.3. Default Schema로 지정하기

좌측 상단의 홈 아이콘을 클릭해 메인으로 이동하고, plming connection에서 마우스 오른쪽 클릭해 Edit Connection을 실행한다.

Edit Connection

비어있는 Default Schema에 board를 입력한 후, Test Connection이 정상적으로 실행되는지 확인한다.

자동으로 board 스키마가 활성화

창을 닫은 후, 다시 plming connection에 접속해보면 자동으로 board 스키마가 활성화되어 있는 것을 확인할 수 있다.

 

5.4. 프로젝트에서 사용할 테이블 추가

DB 설계 ERD
DB ERD 설계

백엔드 팀원이 DB 설계를 마치고 DB 모델을 공유해주셨다. 공유해주신 DB 모델의 테이블 데이터를 board 스키마에 추가한다.

추가한 table

 

6. IntelliJ 설정

6.1. 데이터 소스(DataSource) 설정하기

스프링 부트에서 데이터 소스 설정은 application.properties 파일을 이용해서 처리할 수 있다.

'src/main/resource' 디렉터리의 application.properties 파일을 열고, 아래 코드를 입력한다.

  • username과 password 부분은 본인의 username과 password로 변경해주어야 한다.
spring.datasource.hikari.url=jdbc:mysql://localhost:3306/board?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.hikari.username=username
spring.datasource.hikari.password=password
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.connection-test-query=SELECT NOW() FROM dual

 

속성을 정리해보면

속성 설명
jdbc-url 데이터베이스의 주소를 의미한다.
포트 번호 뒤의 board는 MySQL에서 생성한 스키마의 이름이며,
serverTimezone 등의 파라미터는 한글 등의 기본적인 설정을 처리하는 용도이다.
username MySQL을 설치하는 과정에서 입력했던 아이디를 의미
password MySQL을 설치하는 과정에서 입력했던 비밀번호를 의미
connection-test-query connection이 정상적으로 맺어졌는지 확인하기 위한 SQL 쿼리문
애플리케이션이 정상적으로 실행되면, 테스트 쿼리가 콘솔에 출력된다.

"Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured." 오류 발생 시 위 코드를 아래 코드로 변경해주면 된다.

spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/board?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=1111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.connection-test-query=SELECT NOW() FROM dual

 

6.2. 패키지 & 클래스 추가하기

'src/main/java/plming/board' 패키지 내에 configuration 패키지를 추가하고, configuration 패키지에 DBConfiguration 클래스를 생성한다.

생성한 뒤, 더보기의 소스 코드를 입력한다.

더보기
package plming.board.configuration;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@PropertySource("classpath:/application.properties")
public class DBConfiguration {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(hikariConfig());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
//		factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**/*Mapper.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSession() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory());
    }

}

코드를 살펴보면

애너테이션 설명
@Configuration 스프링은 @Configuration이 지정된 클래스를 자바 기반의 설정 파일로 인식
@PropertySource 해당 클래스에서 참조할 properties 파일의 위치를 지정
@Autowired Bean으로 등록된 인스턴스를 클래스에 주입하는데 사용
ApplicationContext Spring Container 중 하나
Container는 Bean의 생성과 사용, 관계, 생명 주기 등을 관리
@Bean Configuration 클래스의 메서드 레벨에만 지정 가능
@Bean이 지정된 인스턴스는 컨테이너에 의해 관리되는 Bean으로 등록됨
@ConfigurationProperties 인자에 prefix 속성을 지정할 수 있음

@PropertySource에 지정된 파일에서 prefix에 해당하는 문자열로 시작하는 설정을 모두 읽어 들여 해당 메서드에 매핑

메서드뿐만 아니라 클래스 레벨에도 지정 가능
hikariConfig 하카리 CP 객체를 생성
하카리 CP는 Connection Pool 라이브러리 중 하나
dataSource 데이터 소스 객체를 생성

Connection Pool은 Connection 인스턴스를 생성해두고, 데이터베이스에 접근하는 사용자에게 미리 생성해둔 Connection을 제공했다가 돌려받는 방법

데이터 소스는 Connection Pool을 지원하기 위한 인터페이스
sqlSessionFactory SqlSessionFactory 객체를 생성

SqlSessionFactoryBean은 MyBatis와 Spring 연동 모듈로 사용됨

MyBatis XML Mapper, 설정 파일 위치 등을 지정하고, SqlSessionFactoryBean 자체가 아닌, getObject 메서드가 리턴하는 SqlSessionFactory를 생성
sqlSession sqlSession 객체를 생성

SqlSessionTemplate은 SqlSessionFactory를 통해 생성되고, 데이터베이스의 커밋, 롤백 등 SQL의 실행에 필요한 모든 메서드를 갖는 객체로 생각할 수 있음

 

6.3. 테스트 코드 작성하기

JUnit을 이용해 단위 테스트를 진행했다.

'src/test/java/plming/board'의 BoardApplicationTests 클래스에 더보기의 코드를 입력한다.

더보기
package plming.board;

import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;

@SpringBootTest
class BoardApplicationTests {

   @Test
   void contextLoads() {
   }

   // 추가
   @Autowired
   private ApplicationContext context;

   @Autowired
   private SqlSessionFactory sessionFactory;

   @Test
   public void testByApplicationContext() {
      try {
         System.out.println("=========================");
         System.out.println(context.getBean("sqlSessionFactory"));
         System.out.println("=========================");

      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   @Test
   public void testBySqlSessionFactory() {
      try {
         System.out.println("=========================");
         System.out.println(sessionFactory.toString());
         System.out.println("=========================");

      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

각각의 함수를 실행시켜도 되고, class 레벨에서 한 번에 실행시켜 테스트를 진행해도 된다.

class 레벨에서 테스트를 진행해보면

테스트 결과

모든 함수에서 테스트가 잘 동작하는 것을 확인할 수 있다.

6.4. Spring 서버 띄워보기

마지막으로 Spring 서버가 잘 띄워지는지 확인해봤다.

Spring 서버 띄우기

Tomcat이 잘 실행되는 것을 확인할 수 있다.

 

개발 환경 세팅 시 참고한 블로그입니다. 특히 1번 블로그의 도움을 많이 받았어요! (1번 블로그는 앞으로도 많이 참고할 예정)

1. (전체) https://congsong.tistory.com/14?category=749196
2. (4. MySQL, IntelliJ 연동 부분) https://dawitblog.tistory.com/4
728x90
LIST

댓글