티스토리 뷰

복습

지난 https://hyunsangwon93.tistory.com/24 포스팅에서 시큐리티의 간단한 개념과 인증 순서를 배웠다.

 

스프링 부트 시큐리티(spring boot security) 시작 [1]

서론 Spring Security는 Spring으로 웹을 개발한다면 필수적인 프레임워크이다. 왜일까? 기본적인 세션관리 HTTP 보안 및 어플리케이션 보안을 담당해준다. 초기 설정은 생각보다 복잡하다. 그리고 개발자마다 시..

hyunsangwon93.tistory.com

Config 클래스와 SecurityService 클래스가 무엇인지 간단하게 추가적으로 알았지만

오늘 포스팅부터 DB모델링부터 시큐리티 설정까지 차근차근 해보겠다. 

 

필자의 개발 환경은 전 포스팅에서 언급했으니 Keep 하겠다.

또한 프로젝트 생성 과정도 킵하겠다..

 

아래 포스팅 순서대로 쭈~~욱 따라하면 문제없이 시큐리티가 완성되니 시작해보자!

 

Maven 등록 (pom.xml)

 

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--Thymeleaf -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<!--Mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!--Mybatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.1</version>
		</dependency>
		<!--Lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!--Devtools -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<!--Security-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
</dependencies>

 

LombokDevtools는 이번 포스팅과 연관없는 라이브러리 이지만, 개발할때 편하므로 넣어도 상관없다.

각 두개가 무엇인지 궁금하다면 이번주제가 시큐리티만큼 패스 하겠다. 궁금하다면 댓글 달아주시면 

감사하겠다!

 

properties 혹은 yaml 파일 설정

필자는 yaml 파일로 작성을 한다. yaml 파일이 무엇인지 궁금하다면 아래 포스팅을 참고 하면 되겠다.

 

https://hyunsangwon93.tistory.com/22

 

Spring boot yaml 파일 사용법

YAML을 사용하는 이유(장점) 1. 프로퍼티스 파일같은 경우는 중복된 코드 삽입 2. --- 신택스로 파일을 분리할 필요가 없이 한파일내에서 마치 분리해서 사용가능 3. 보기 편하다 Spring Boot 에서 YAML파일 사용..

hyunsangwon93.tistory.com

 

application:
   version: v1.0.0
   title: boot-security
   
spring:
   datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
 ## initialization-mode 옵션: never, always (어플리케이션 실행시 sql파일 실행할지 안할지 여부 선택)
    initialization-mode: never
 ## sql 파일 경로
    schema: classpath:init.sql
    url: jdbc:mysql://localhost:3306/boot-security?useUnicode=true&charaterEncoding=utf-8&serverTimezone=UTC
    username:
    password:
        
   devtools:
    livereload:
      enabled: true
    restart:
      enabled: true
      
   thymeleaf:
      cache: false
      mode: HTML
      
## 마이바티스 sql.xml 경로      
mybatis:
  mapper-locations: classpath:/sqlmap/sqlmapper_*.xml

 

필자는 sql파일을 따로 분리한다. DDL을 따로 관리하면 유지보수 하기 편하다. 

initialization-mode : never 아직 sql파일이 없으면 never 해놓자.

 

never는 어플리케이션 실행시 sql파일을 읽지 않겠다 라는 뜻이고,

always는 어플리케이션 실행시 sql파일을 실행 하겠다 뜻이다.

 

SQL 파일 작성및 바이바티스 mapper-location 폴더 생성

그리고 컨트롤러와 서비스 등등 필요한 패키지를 생성하겠다. 모두 생성하고 나면 아래 그림과 같이 보이면 되겠다.

 

디렉토리

 

src/main/resources 안에 SQL파일과 쿼리.xml이 생성된걸 확인할 수 있다.

 

이제 컨트롤러,서비스,컨피그 등등 만든 패키지 안에 아래 그림과 같이 클래스와 인터페이스 파일을 넣자

각각 무엇을 담당하는지 이어서 설명하겠다.

 

디렉토리2

com.examlple.demo.config :

 SecurityConfig :

   스프링 시큐리티 보안,인증 설정

 WebConfig :

   mapper 설정

 

com.examlple.demo.controller :

로그인 페이지 이동 처리및 인증 페이지 처리 예정

 

com.examlple.demo.service :

UserDetailsService인터페이스를 구현할 예정  

 

com.examlple.demo.mapper :

mapper 파일 namesapce 매핑 예정

 

com.examlple.demo.vo :

UserPrincipalVO: 

  UserDetails 인터페이스 구현 예정

UserVO : 

  login 페이지에서 받아올 객체

 

이렇게 기본틀이 되겠다. 진행하다보면 VO 패키지에 클래스가 더 추가될 것이다.

 

DB 모델링 구축

1:1 관계로 구축해도 되고 1:M 관계로 구축해도 상관없다. 어플리케이션 특징마다 다름!

 

즉, 한유저당 하나의 권한을 줄것이냐? 한 유저당 여러 권한을 부여할것이냐에 따라 모델링이 다르단 말씀! ....

 

 

확장성으로 고려해 한유저당 여러 권한을 주는 방법으로 모델링을 구현하겠다. 

한유저당 하나의 권한으로 해버릴 경우 확장을 못한다. 모델링 다시해야됨 ㅎㅎㅎ...

 

모델링 구조는 아래 그림과 같은 모습이다.

 

모델링

 

유저 테이블에는 유저정보가, 권한 테이블에는 어떤 권한들이 있는지에 대한 정보,

유저 권한 테이블은 어떤 유저가 어떤 권한을 가졌는지에 대한 테이블 구조가 되겠다.

 

init.sql 작성

/src/main/resources/init.sql 경로에 들어가 아래 코드와 같이 입력해준다.

 

##DDL
CREATE TABLE IF NOT EXISTS user
(
	user_no BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
	id VARCHAR(20) NOT NULL,
	password VARCHAR(100) NOT NULL,
	name VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS role
(
	role_no INT NOT NULL PRIMARY KEY,
	role_name varchar(20) NOT NULL  
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS user_role
(
  user_no BIGINT NOT NULL,
  role_no INT NOT NULL,
  FOREIGN KEY (user_no) REFERENCES user (user_no),
  FOREIGN KEY (role_no) REFERENCES role (role_no)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

##DML
INSERT INTO role (role_no, role_name) VALUES (1, 'ADMIN');
INSERT INTO role (role_no, role_name) VALUES (2, 'USER');

 

컬럼이 많지 않기때문에 코멘트는 달지않았다. 

 

Config 클래스 설정

com.examlple.demo.config 에 있는 WebConfig클래스를 작업하겠다.

 

*SecurityConfig는 맨 마지막에 작성하겠다.

 

WebConfig.java 
package com.example.demo.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(value= {"com.example.demo.mapper"})
public class WebConfig {

}

 

@MapperScan을 붙여 해당 경로가 mybatis mapper 경로야~ 라고 설정해준다.

 

 

sqlmapper_*.xml 수정
<?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">
<mapper namespace="com.example.demo.mapper.HomeMapper">

</mapper>

mapper namespace를 지정해준다. 

 

yaml 파일 수정

yaml 에서 initialization-mode: never 모드를 always로 수정후,

어플리케이션을 실행해 테이블이 만들어 졌는지 확인하자. 

 

initialization-mode: always

 

*** 실행전에 데이터베이스와 유저를 만들었는지 , DB 포트번호가 맞는지 확인하고 실행하자.

 

 

실행후 데이터베이스 테이블을 조회 하면 아래 그림과 같이 자동생성이 될것이다.

 

테이블 생성

 

테이블 생성과 기본 설계는 되었고 이제 시큐리티를 커스텀 마이징 해보자...

이번 포스팅에서 끝내려고 했으니 [3] 시리즈를 이어서 나가야 될것같다 ㅠㅠ 

 

ps. 지금까지 했던 작업중 궁금한 사항이 있으면 댓글 달아주세요 :)