-
Spring Boot๋ฅผ ์ด์ฉํ์ฌ Web์์ ๋์ ๊ฐ๋ฅํ To Do List๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ํ๋ก์ ํธ์ ๋๋ค.
-
์ด ์ ์ฅ์๋ To Do List Web Application์ ๊ฐ๋ฐํ๋ฉด์ ์์ค์ฝ๋ ๊ด๋ฆฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํ ์ ์ฅ์์ ๋๋ค.
-
๋ชฉ์
-
Spring Boot & JPA ํ์ต ๋ฐ Web Application(To Do List) ๊ฐ๋ฐ.
-
Spring Security ํ์ต ๋ฐ ๋ก๊ทธ์ธ, ํ์๊ฐ์ ๊ตฌํ.
-
JUnit ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ ๋ด์์ ํ ์คํธ ํด์ผํ ์ผ์ด์ค๋ค์ ํ ์คํธ ์ฝ๋ ์์ฑ ๋ฐ ํ์ต.
-
๋๊ตฌ | ๋ฒ์ |
---|---|
Framework | Spring Boot 2.1.3 |
OS | Windows 10 |
IDE | IntelliJ IDEA Ultimate |
JDK | JDK 1.8 |
DataBase | MySQL Server 5.7 |
Build Tool | Gradle 5.2.1 |
์ธ๋ถ์ ๋ณด
-
์ค๋น์ฌํญ.
-
Gradle or IntelliJ IDEA
-
JDK (>= 1.8)
-
Spring Boot (>= 2.x)
-
-
์ ์ฅ์๋ฅผ
clone
$ git clone https://github.com/donghL-dev/Project-ToDoList.git
-
ํ๋ก์ ํธ ๋ด Project-Matching\src\main\java\com\matching\config ๊ฒฝ๋ก์
HttpConfig.java
์ญ์ ๋๋ ๋ด์ฉ ์ฃผ์์ฒ๋ฆฌ. -
DB๋ MySQL์ ์ด๋ค๊ณ ๊ฐ์ .
- ๋ค๋ฅธ DB๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๊ทธ DB์ ๋ง๊ฒ ์ค์ ์ ํด์ผํจ.
-
ํ๋ก์ ํธ ๋ด src\src\main\resources ๊ฒฝ๋ก์
application.yml
์์ฑ.- ๋ฐ์ ์์๋๋ก ๋ด์ฉ์ ์ฑ์ด ๋ค,
application.yml
์ ์ฝ์ .
spring: datasource: url: jdbc:mysql://localhost/๋ณธ์ธ_DB username: ๋ณธ์ธ_DB_User password: ๋ณธ์ธ_DB_User_Password driver-class-name: com.mysql.jdbc.Driver jpa: hibernate: ddl-auto: create
- ๋ฐ์ ์์๋๋ก ๋ด์ฉ์ ์ฑ์ด ๋ค,
-
IntelliJ IDEA(>= 2018.3)์์ ํด๋น ํ๋ก์ ํธ๋ฅผ
Open
-
๋๋ ํฐ๋ฏธ๋์ ์ด์ด์ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ์ง์ ํด์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํ.
-
Windows 10
$ gradlew bootRun
-
Ubuntu 18.04
$ ./gradlew bootRun
-
์ธ๋ถ์ ๋ณด
-
Spring-Boot-Web-TDL ํ๋ก์ ํธ ์์ฑ.
-
ToDoList ํด๋์ค ์ค๊ณ ๋ฐ ์์ฑ.
-
Idx(ํค) -> Integer
-
Description(๋ด์ฉ) -> String
-
Status(์๋ฃ ์ฌ๋ถ) -> Boolean
-
CreatedDate(์์ฑ ์๊ฐ) -> LocalDateTime
-
CompletedDate(์๋ฃ ์๊ฐ) -> LocalDateTime
-
-
ํ๋ก์ ํธ ํจํค์ง ์์ฑ.
- ๋๋ฉ์ธ, ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ ํจํค์ง ์์ฑ.
-
ํ๋ก์ ํธ์ MySQL ์ฐ๋ ๋ฐ ํ ์คํธ
-
application.yml ๋ฐ build.gradle ์์
-
MySQL DB์ ๋ฐ์ดํฐ ์ฝ์ ๋ฐ ํ์ธ.
-
-
์๋น์ค ํธ์ถ ๋ฐ ๋ทฐ ๋ฐํ์ ์ํ ToDoListController ํด๋์ค ์์ฑ.
-
์ ์ฅ์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ์ ์ํ ToDoListService ํด๋์ค ์์ฑ.
-
๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ list.html ์์ฑ
-
๋ถํธ ์คํธ๋ฉ์ ์ด์ฉํด์ ๋ทฐ ๊พธ๋ฏธ๊ธฐ.
-
๋ถํธ ์คํธ๋ฉ์ Spring ํ๋ ์์ํฌ์์ ์ฌ์ฉ์์ ๊ฒฝ๋ก ๋งคํ์ ์ฃผ์ํด์ผํจ.
-
CSS ์ ์ฉ ์, ๊ฒฝ๋ก๋ /static/css๊ฐ ์๋๋ผ /css๋ก ๊ฒฝ๋ก ์ค์ ํด์ผ ํจ.
<link rel="stylesheet" href="/css/bootstrap.min.css"/>
-
-
๋ถํธ์คํธ๋ฉ์ ํ์ฉํ ๋ทฐ ํ์ธ
-
-
IntelliJ IDEA ์ MySQL ์ฐ๋
- View ์์ ๋ฐ ์ ๋ฐ์ดํธ
-
View ์์ ๋ฐ ์ ๋ฐ์ดํธ
-
css ์ค์ ๊ฐ ์ถ๊ฐ ๋ฐ ์์
-
Header์ Footer ์์ฑ.
-
-
to do list ๋ชฉ๋ก์ CRUD๋ฅผ ์ํ ToDoListRestController ํด๋์ค ์์ฑ.
-
to do list ๋ชฉ๋ก์ ์์ฑ์ ์ํ ๊ฐ์ View์์ Input์ ํตํด ๋ฐ์์ด.
-
๋ฐ์์จ Input๊ฐ์ postToDoList ๋ฉ์๋๋ฅผ ํตํด์ ๋ฐ PostMapping์ผ๋ก url ๋งคํ ์ฒ๋ฆฌํ ToDoListService์์ ๋ก์ง ์ฒ๋ฆฌ.
-
ToDoListService์์ ๋ก์ง์ ํตํด DB์ ๊ฐ์ ์ ์ฅ ํ ๋ค View๊ฐ Redirect ๋ ํ ์ ์ฅ๋ ๋ชฉ๋ก ์ถ๋ ฅ.
-
-
to do list ๋ชฉ๋ก์ ์ญ์ ๊ธฐ๋ฅ๊ณผ ์ํ์ ๋ด์ฉ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ ๊ตฌํ
-
์ญ์ ๋ฅผ ํ๊ธฐ ์ํด์ @PathVariable๋ฅผ ํตํด์ idx ๊ฐ์ ๋ฐ์์จ ๋ค DeleteMapping์ผ๋ก ๋งคํ์ํจ ๋ค, deleteToDoList ๋ฉ์๋๋ฅผ ์์ฑํด์ ๋ก์ง ์ฒ๋ฆฌ.
-
์ํ์ ๋ด์ฉ ์ ๋ฐ์ดํธ๋ฅผ ์ํด์ @PathVariable๋ฅผ ํตํด์ idx ๊ฐ์ ๋ฐ์์จ ๋ค PutMapping์ผ๋ก ๋งคํ์ํจ ๋ค, putDescription, putStatus ๋ฉ์๋๋ฅผ ์์ฑํด์ ๋ก์ง ์ฒ๋ฆฌ.
-
-
๊ธฐ์กด์ View์์ ์ ๋ฐ์ดํธ
-
User ๋ชจ๋ธ๊ณผ ToDoList ๋ชจ๋ธ 1 : 1 ๊ด๊ณ ์ค์ .
-
User ๋๋ฉ์ธ ํด๋์ค ์์ฑ
-
Idx(ํค) -> Integer
-
Name(์ด๋ฆ) -> String
-
Email(์ด๋ฉ์ผ) -> String
-
Password(๋น๋ฐ๋ฒํธ) -> String
-
-
๊ธฐ์กด์ ToDoList ํด๋์ค์ User ์ปฌ๋ผ ์ถ๊ฐ.
@OneToOne(fetch = FetchType.LAZY) private User user;
-
User ๊ฐ์ฒด ์์ฑ ํ MySQL DB์ ๋ฐ์ดํฐ ์ฝ์ .
- CommandLineRunner๋ฅผ ์ด์ฉํด์ ์์ฑ ๋ก์ง ์ฒ๋ฆฌ.
-
User ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ Controller, Repository, Service ํด๋์ค ์์ฑ.
-
ToDoListController ํด๋์ค์ ToDoListRestController์ ์์ ์ ํตํด์ User ๊ฐ์ฒด ๊ฐ ์ ์ฅ.
-
๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
-
๋ก๊ทธ์ธ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ์ํ LoginController ํด๋์ค ์์ฑ
-
๋ก๊ทธ์ธ ๋ทฐ ์์ฑ.
-
-
ํ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ
-
ํ์๊ฐ์ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ์ํ RegisterController ํด๋์ค ์์ฑ
-
ํ์๊ฐ์ ๋ทฐ ์์ฑ.
-
-
ํ์๊ฐ์ ํ์ธ
-
Username, Email, Password Ajax ๊ฐ์ฒด ์์ฑ ํ, ๋ฐ์ดํฐ ์ ์ก.
-
ํ์ํ ๊ฐ์ ๋ฐ์์์ ํ์๊ฐ์ ๋ก์ง์ ํตํด ์ ์ ์ ํ์ํ ๊ฐ์ ์ ์ฅ ํ, ์ ์ ์์ฑ.
-
-
๋ก๊ทธ์ธ ํ์ธ
-
Username, Password Ajax ๊ฐ์ฒด ์์ฑ ํ, ๋ฐ์ดํฐ ์ ์ก.
-
loginUser ํจ์ ์์ฑ ํ, ํ์ํ ๊ฐ์ ๋ฐ์์จ ํ ๋ก๊ทธ์ธ ์ฒดํฌ.
-
Username์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ๋ก๊ทธ์ธ ์คํจ.
-
Username์ด ์กด์ฌํ ๊ฒฝ์ฐ, password๊ฐ ์ผ์น ํ์ง ์์์ ๋ก๊ทธ์ธ ์คํจ.
-
Username์ด ์กด์ฌํ ๊ฒฝ์ฐ, password๊ฐ ์ผ์นํ๋ค๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต.
-
-
-
๋ก๊ทธ์ธ์ ํ์ง ์๊ณ To Do List url๋ก ์ด๋ํ ๊ฒฝ์ฐ, ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก redirect ๋๋๋ก ์ค์ .
-
To Do List์ ํ์ฌ ๋ก๊ทธ์ธ์ ํ ์ ์ ๊ฐ ๋ฑ๋กํ To Do ํญ๋ชฉ๊ณผ Complete ํญ๋ชฉ์ด ๋ณด์ด๋๋ก ์ค์ .
-
To Do๊ฐ ๋ฑ๋ก๋ ๋, DB์ To Do List์ ํ ์ด๋ธ์๋ ํ์ฌ ๋ก๊ทธ์ธ ํ ์ ์ ์ Idx๊ฐ ์ ์ฅ๋จ.
-
User ๋ชจ๋ธ ๊ฐ์ฒด์ ToDoList ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ ๊ด๊ณ๋ฅผ ๋จ๋ฐฉํฅ ๊ด๊ณ์์ ์๋ฐฉํฅ ๊ด๊ณ๋ก ์ฌ์ค์ .
-
@OneToMany
์ด๋ ธํ ์ด์ ๊ณผ@ManyToOne
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๊ด๊ณ์ฑ ์ฌ์ค์ . -
Foreign Key๋ฅผ ๊ฐ์ง๊ณ ์๊ณ OwnerShip์ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ธ ๊ฐ์ฒด์
@ManyToOne
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ. -
OwnerShip์ ๊ฐ์ง๊ณ ์์ง ์์ ๋ชจ๋ธ ๊ฐ์ฒด์
@OneToMany
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ. -
@OneToMany
๋ฅผ ์ฌ์ฉํ ๋ชจ๋ธ ๊ฐ์ฒด์@OneToMany
์ด๋ ธํ ์ด์ ์ ์์ฑ ์ค ํ๋์ธ mappedby๋ก OwnerShip์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ ๋ณ์๋ช ์ ๊ธฐ์ ํ๋ค. -
OwnerShip์ ๊ฐ์ง๊ณ ์์ง ์์ ๋ชจ๋ธ ๊ฐ์ฒด์๋ OwnerShip์ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ธ ๊ฐ์ฒด๋ก ๋ ํ๋๋ฅผ Collection ์๋ฃํ์ผ๋ก ์ ์ธํ๋ค.
-
-
ToDoList ๋ชจ๋ธ์
@ManyToOne
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ณ , User ๋ชจ๋ธ์@OneToMany
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ N : 1 ์๋ฐฉํฅ ๊ด๊ณ๋ก ์ค์ . -
ํ ์ด๋ธ ๋ฐ ์ฝ๋ ํ์ธ
-
ํ์ฌ User๊ฐ ์์ ์ด ๋ฑ๋กํ ToDoList๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
-
User ๋๋ฉ์ธ ํด๋์ค์
@OneToMany
์ด๋ ธํ ์ด์ ์ ์์ฑ์ผ๋ก FetchType์ EAGER๋ก ์ค์ ํ๋ค. -
User ๋๋ฉ์ธ ํด๋์ค์ ์๋ List todolists ํ๋์ ํ์ฌ ์ ์ ๊ฐ ์์ฑํ ToDoList ๋ชฉ๋ก์ ๋ฃ๊ธฐ ์ํด ArrayList๋ก ์์ฑํ๋ค.
-
User ๋๋ฉ์ธ ํด๋์ค์ List todolists ํ๋์ ํ์ฌ ์ ์ ๊ฐ ์์ฑํ ToDoList ๋ชฉ๋ก์ ๋ฃ๊ธฐ ์ํ add ๋ฉ์๋ ์์ฑ.
public class User { ... ... ... @OneToMany(mappedBy = "user", fetch = FetchType.EAGER) private List<ToDoList> toDoLists = new ArrayList<>(); ... ... public void add(ToDoList toDoList) { toDoList.setUser(this); this.toDoLists.add(toDoList); } }
-
/list url๋ก redirect ๋ ๋๋ง๋ค ์ฝ์์ ํ์ฌ User์ Idx์ User๊ฐ ๊ฐ์ง๊ณ ์๋ ToDoList๋ค์ ๊ฐ์ฒด๋ค์ ์ถ๋ ฅ.
-
Spring Security ์ ์ฉ์ ์ํ ํ ์คํธ ํ๋ก์ ํธ ์์ฑ.
-
Spring Security๋ฅผ ์ํ, ์์กด์ฑ ์ค์ .
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compile 'org.springframework.security:spring-security-web:4.2.7.RELEASE' compile 'org.springframework.security:spring-security-config:4.2.7.RELEASE' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
-
application.yml ์ค์ .
server: port: 8080 logging: level: root: WARN org.springframework.web: INFO org.springframework.security: INFO spring: thymeleaf: cache: false
-
templates์ ํ์ํ index.html, login.html, user/index.html ์์ฑ.
-
์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ์ ์ํ ์ฝ๋ ์์ฑ.
-
MainController ํด๋์ค ์์ฑ.
-
SecurityConfig ํด๋์ค ์์ฑ.
-
SecurityConfig ํด๋์ค์ WebSecurityConfigurerAdapter ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ,
@EnableWebSecurity
์ด๋ ธํ ์ด์ ์ ์ ์ฉํจ. -
configure() ๋ฉ์๋์, configureGlobal() ๋ฉ์๋ ์์ฑ.
-
configureGlobal() ๋ฉ์๋์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ฆ ์ฝ๋ ๋ถ๋ถ์ password ๋ถ๋ถ์ ์ธ์ฝ๋ฉ ํด์ฃผ์ง ์์์ ์๋ฌ๊ฐ ์ผ์ด๋จ.
-
PasswordEncoder ํด๋์ค๋ฅผ ์ด์ฉํด์ ์ธ์ฝ๋ฉ ์๋ฌ๊ฐ ์ผ์ด๋๋ ๋ถ๋ถ์ ํด๊ฒฐ.
-
-
-
-
-
day-12์์ ์์ฑํ ํ๋ก์ ํธ์์ GUIDE๋ฅผ ํตํด ์ฝ๋ ์ค์ต ์งํ.
-
ํ ํ๋ฆฟ์
home.html
๊ณผhello.html
๋ฅผ ์์ฑํ๊ณ , MvcCofig ํด๋์ค๋ฅผ ์์ฑ. -
MvcConfig ํด๋์ค๋ฅผ ์์ฑํ ๋ค์,
@Configuration
์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ณ ,WebMvcConfiguer
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋๋ค. -
๊ทธ ์ดํ,
addViewController(ViewControllerRegistry registry)
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ค, registry์ViewController
๋ฅผ ์ถ๊ฐํ๋ค.-
registry.addViewController("/home").setViewName("home");
-
/home url๋ก ์ด๋ํ์ ๋,
home
์ด๋ผ๋ ์ด๋ฆ์ view name์ ๊ฐ์งhome.hml
๋ก ๋งคํํด์ฃผ๋ ๋ฐฉ์์ด๋ค. -
๊ทธ ๋ฐ์ ๋ค๋ฅธ ViewController๋ ์ถ๊ฐํ๋ค.
-
-
๊ทธ ์ดํ, ์คํ๋ง ์ํ๋ฆฌํฐ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ , ์คํํด๋ณด๋ฉด ๋ชจ๋ ํ์ด์ง๊ฐ ์ ๊ธ์ด ๊ฑธ๋ฆฐ๋ค.
-
์ํ๋ฆฌํฐ ์ค์ ์ ์ํ WebSecurityConfig ํด๋์ค๋ฅผ ์์ฑํ๊ณ WebSecurityConfigurerAdapter ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
-
WebSecurityConfig ํด๋์ค์
@Configuration
์ด๋ ธํ ์ด์ ๊ณผ@EnableWebSecurity
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค. -
@EnableWebSecurity
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ์๊ฐ, ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ์คํ๋ง ์ํ๋ฆฌํฐ ์ค์ ์ ๋ฐ๋ผ๊ฐ๋ค๊ณ ๊ฐ์ ํ๋ค. -
WebSecurityConfig ํด๋์ค์ HttpSecurity๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ configure() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ.
-
.authorizeRequests()
์ ์์ฒญ์ ๋ํด ์ด๋ป๊ฒ ๋ณด์์ ๊ฑธ ๊ฒ์ธ๊ฐ์ ๋ํ ์ค์ ๋ฉ์๋์ด๋ค. -
.antMatchers()
๋ ํน์ ํ ํจํด์ ๋ํ ์์ฒญ๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ค์ ๊ฐ์ด๋ค. -
.antMatchers().permitAll()
๋.antMatchers()
๋ก ์ง์ ๋ ํจํด์ ๋ํ ์์ฒญ๋ค์ ์ ๋ถ๋ค ํ์ฉํ๋ผ๋ ์๋ฏธ์ด๋ค..antMatchers("/", "/home").permitAll()
/ ์ /home์ ๋ํด์๋ ์ ๋ถ ํ์ฉํ๋ผ, ๋ก๊ทธ์ธ์ ์ํ ์ฌ์ฉ์์๊ฒ๋ ๋ณด์ด๋๋ก ์ค์ .
-
.anyRequest().authenticated()
์ด์ธ์ ์์ฒญ๋ค์ ์ธ์ฆ์ด ํ์ํ ์์ฒญ์ด๋ผ, ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ. -
.formLogin()
์์ฑ์ Login์ ๊ดํ ์์ฑ์ด๋ค..anyRequest().authenticated()
์์ฑ์ผ๋ก ์ธํด์ ์ด์ธ์ ์์ฒญ๋ค์ formLogin์ผ๋ก ์ค์ ๋ loginPage๋ก ์ด๋. -
.loginPage()
์ loginPage๋ก ๊ฐ๋ Url์ด ์ด๋ค๊ฒ์ธ๊ฐ์ ๋ํ ์ค์ ์ด๋ค. -
.logout()
๋ฉ์๋๋ ๋ก๊ทธ์์์ ๋ํ ์์ฑ ๊ฐ์ ๋ํ ์ค์ ์ด๋ค..logoutUrl()
๋ฉ์๋๋ ๋ก๊ทธ์์์ Redirect ๋๋ Url์ ๊ฒฐ์ ํ๋ค.
-
WebSecurityConfig ํด๋์ค์ userDetailsService() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ.
-
UserDetails ํด๋์ค๋ฅผ ํตํด user ์์ฑ.
-
.withDefaultPasswordEncorder()
์์ฑ์ ํตํด ํจ์ค์๋ ์ธ์ฝ๋ฉ ์ค์ . -
.userName()
์ ํตํด user ์ด๋ฆ ์ค์ . -
.password()
์ ํตํด ํจ์ค์๋ ์ค์ -
.roles()
์ ํตํด ๊ถํ ์ค์ . -
InMemoryUserDetailsManager ํด๋์ค๋ฅผ ํตํด ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ๋ฅผ ์ ์ฅ.
-
-
-
login.html
์์ฑ -
hello.html
์ฝ๋ ๋ณ๊ฒฝ, ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์์ ์ ๋ณด ํ์ ๋ฐ ๋ก๊ทธ์์ ๋ฒํผ ์์ฑ. -
๊ฒฐ๊ณผ
-
๋ก๊ทธ์ธ์ ํ๊ธฐ์ ๊น์ง๋
/
๊ณผ/home
๊ณผ/loign
url๋ง ์ ๊ทผ ๊ฐ๋ฅ. -
๋ก๊ทธ์ธ์ ํ๊ธฐ์ ๊น์ง๋ ํ์ฉ๋ url ์ด์ธ์ url ์ ๊ทผ์,
/loign
url๋ก Redirect -
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, ๊ธฐ์กด์
/home
์์ ์ด๋ํ๊ณ ์ ํ๋,/hello
url๋ก ์ ๊ทผํ ์ ์๋ค. -
๋ก๊ทธ์์์ ํ๋ฉด, ๋ค์
/login
url๋ก ๋์๊ฐ๋ค. -
์ฆ, ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ํตํด์ ๋ก๊ทธ์ธ์ ์ฑ๊ณต์ํค๋ฉด, ์ ์ ๋ ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ๋๊ณ , ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ง์ ์๋ ๊ถํ์ ๊ฐ์ง๊ฒ ๋๋ค.
-
์ ์ฝ๋๋ ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ
/home
์ผ๋ก ์ ๊ทผ์ ํ ์ ์๊ฒ ํ๋ ๊ถํ์ ๋ถ์ฌํ์๋ค.
-
-
-
GUIDE๋ฅผ ํตํด ์งํํ๋ ์ค์ต ์ฝ๋๋ฅผ ์์ ๋ฐ ๋ฆฌํฉํ ๋ง.
-
์ง๋ ์ฝ๋ ๋ด์ฉ ๋ฆฌ๋ทฐ
-
์ด์ ์ ์งํํ๋ UserDetails ํด๋์ค๋ฅผ ํตํด์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ํ ์คํธ ์ฝ๋์์ ์ฃผ๋ก ์ฐ์ด๋ ๋ฐฉ์.
-
ํ์ค์ ์ธ User๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์ด์ ์ฝ๋์์ UserDetails ํด๋์ค ์ฝ๋ ๋ถ๋ถ ์ ๊ฑฐ.
-
AccountController, AccountService, AccountRepository ์์ฑ.
-
AccountService ํด๋์ค์์ UserDetailsService ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋๋ค.
-
loadUserByUsername()
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค.-
loadUserByUsername()
๋ฉ์๋์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ username์ผ๋ก Account๋ฅผ ๋ ํฌ์์ ์ฐพ์์ค๊ณ , ์ฐพ์์จ Account๋ฅผ UserDetalis ์ธํฐํ์ด์ค๋ก ๋ณํํ๋ค. -
Account๋ ํ์ฌ ํ๋ก์ ํธ๋ง์ ๋๋ฉ์ธ์ด๋ฏ๋ก, ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์ด ๋๋ฉ์ธ์ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์ ์ ์๋๋ก UserDetalis ์ธํฐํ์ด์ค๋ก ๋ณํํ๋ค.
-
UserDetalis ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ฝ๋.
UserDetails userDetails = new UserDetails() { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getPassword() { return null; } @Override public String getUsername() { return null; } @Override public boolean isAccountNonExpired() { return false; } @Override public boolean isAccountNonLocked() { return false; } @Override public boolean isCredentialsNonExpired() { return false; } @Override public boolean isEnabled() { return false; } }
-
ROLE์ ๊ดํ๊ฒ์ ์๋๋ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๋, ๊ฐ๋จํ๊ฒ UserDetails ์์ ROLE์ ๋ง๋ค์ด์ ์ฒ๋ฆฌํจ.
-
User๋ฅผ ์์ฑํ๊ธฐ ์ํด์ WebSecurityConfig ํด๋์ค์์
/careate
url๋ ์ธ์ฆ์์ด ์ ์ํ ์ ์๋๋ก ์์ . -
ํ๋ก์ ํธ ๋น๋ ํ,
/create
url๋ก ์ด๋ํ๋ฉด, ์์ฑ๋ ๊ณ์ ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.- ํด๋น url๋ก ์ด๋ํ์ ๋, ํจ์ค์๋๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋จ. ์ด๋ฐ์์ผ๋ก ํด์ ์๋จ.
-
ํ์ธ๋ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ํ๋๋ผ๋, ์ฝ์ ๋ก๊ทธ์ฐฝ์ ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ฉด์ ๋ก๊ทธ์ธ์ด ๋์ง ์์.
-
์๋ฌ๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, password ์ธ์ฝ๋ฉ ๋ฌธ์ ๊ฐ ์๋ฌ์ ์์ธ์ด ๋จ.
-
ํด๊ฒฐ์ ์ํด์ WebSecurityConfig ํด๋์ค์ PasswordEncoder ํ์ ์ passwordEncoder() ๋ฉ์๋๋ฅผ
@Bean
์ผ๋ก ๋ฑ๋ก.@Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); }
-
AccountService ํด๋์ค์์ account์ ํจ์ค์๋๋ฅผ ๋ถ๋ฌ์์ PasswordEncoder ํด๋์ค๋ฅผ ํตํด์ ์ธ์ฝ๋ฉ์ ๊ฑฐ์น ํ ์ ์ฅ.
-
-
ํ๋ก์ ํธ ์ฌ๋น๋ ํ,
/create
url๋ก ์ด๋ํ๋ฉด, ์์ฑ๋ ๊ณ์ ์ ํจ์ค์๋๊ฐ ์ธ์ฝ๋ฉ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. -
์ธ์ฝ๋ฉ์ ๊ฑฐ์น ํ์๋ ๋ก๊ทธ์ธ ์์ ์ฝ์์ ๋ํ๋ฌ๋ ํจ์ค์๋ ์ธ์ฝ๋ฉ ์๋ฌ๊ฐ ์ผ์ด๋์ง ์๊ณ ์ ์ ๋ก๊ทธ์ธ์ด ๋จ.
-
UserDetalis ๊ฐ์ฒด๋ฅผ ์ธ ๊ฒฝ์ฐ, ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
-
์คํ๋ง ์ํ๋ฆฌํฐ ์์ฒด์ ๋ด์ฅ๋์ด ์๋ User๋ผ๋ ๊ฐ์ฒด๊ฐ UserDetalis๋ฅผ ์์๋ฐ์ผ๋ฏ๋ก User ๊ฐ์ฒด๋ก ๋์ฒดํ๋ฉด ์ฅํฉํ ์ฝ๋๋ฅผ ์ค์ผ ์ ์์.
- ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ User ID, ๋๋ฒ์งธ๋ ํจ์ค์๋, ์ธ๋ฒ์งธ๋ ํด๋น ์ ์ ์ ROLE์ด ๋ค์ด๊ฐ.
return new User(account.getEmail(), account.getPassword(), authorities);
-
์์ฑ๋ ROLE์ ์ํด์ WebSeucrityConfig ํด๋์ค์์ ์ ๊ทผ ๊ถํ์ ๋ํด ๋ค๋ฅด๊ฒ ์ค์ ์ด ๊ฐ๋ฅ.
.antMatchers("/admin/**").hasRole("ADMIN")
์ ๊ฐ์ด ์ค์ ํ๋ค๋ฉด,/admin
์ผ๋ก ์์๋๋ ๋ชจ๋ url์ ADMIN ROLE์ ๊ฐ์ง ์ ์ ๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋จ ์๋ฏธ๊ฐ ๋จ.
-
-
-
ToDoList ํ๋ก์ ํธ์ Spring Security ์ ์ฉ.
-
๊ธฐ์กด์ build.gradle ์ Spring Security ์ ์ํ ์์กด์ฑ ์ถ๊ฐ.
compile("org.springframework.boot:spring-boot-starter-security")
-
ํ๋ก์ ํธ ํ๋ถ์ config ํจํค์ง๋ฅผ ์์ฑํ๊ณ ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ค์ ์ ์ํ SecurityConfig ํด๋์ค ์์ฑ.
-
SecurityConfig ํด๋์ค์
@EnableWebSecurity
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ณ , WebSecurityConfigurerAdapter ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค. -
์์ ๊ฐ์ด ์งํํ ๊ฒฝ์ฐ, ์ฌ์ดํธ ์ ์ฒด๊ฐ ์ ๊ฒจ์ configure() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ํ์ด์ง์ ์ธ์ฆ์ ํด์ .
-
์์์ ๋ํ ์ ๊ทผ ํด์ , ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด PermitAll.
-
-
UserRole ๋๋ฉ์ธ์ ์์ฑ.
-
User์
@ManyToOne
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ๊ด๊ฒ์ฑ์ ๊ฐ์ง๋ค. -
User ํด๋์ค ์ชฝ์์ UserRole๊ณผ
@OneToMany
๊ด๊ณ๋ฅผ ๊ฐ๊ณ , ์ํฐํฐ๋ค์ ์์๊ด๊ณ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด, casccade ์์ฑ์ ์ฃผ๊ณ , UserRole๊ณผ User๋ฅผ ๋๋ค ์ฆ์ ์กฐํํ๊ธฐ ์ํด์ fetchtype์ EAGER๋ก ์ค์ ํ๋ค. -
๊ด๊ณ์ฑ์ ๋งคํํ๊ณ ๋ ์ดํ, 'entityManagerFactory' ์๋ฌ๊ฐ ๋ฐ์.
- ๊ธฐ์กด์ ToDoList์์ ๊ด๊ณ์ฑ ๋งคํ์ผ๋ก ์ธํด์, UserRole๊ณผ์ ๊ด๊ณ์ ์ถฉ๋ ๋ฐ์. ToDoList์ FetchType์ Lazy๋ก ์ฃผ๋ฉด์ ํด๊ฒฐ.
-
๋๋ฉ์ธ ๊ฐ์ ๊ด๊ณ์ฑ ์ค์ ์ ๋ง์นํ, ๊ณ์ ์์ฑ ์๋.
-
Spring Security๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ, ๊ธฐ์กด์ Ajax์ POST ํธ์ถ ์ 403 Forbidden ์๋ฌ๊ฐ ๋ฐ์.
-
์์ธ์ csrf ํํฐ๋ก ์ธํด์, csrf ํ ํฐ ๊ฐ์ด ๋๋ฝ๋์ด์ ๋ฐ์ํ๋ ๋ฌธ์ .
-
Ajax ์์ฒญ Header์ csrf token ์ ๋ณด๋ฅผ ํฌํจํด์ ์ ์ก.
-
-
-
UserDTO ๋๋ฉ์ธ ์์ฑ.
-
DTO : ๊ฐ ๊ณ์ธต๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ํด ์ฌ์ฉ๋๋ ์์ ๊ฐ์ฒด, DTO๋ ๊ฐ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ์๋ฌด๋ฐ ๋ก์ง์ ๊ฐ์ง ์๊ณ ์ค์ง ๋ฐ์ดํฐ๋ฅผ ๋ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋์ Getter/Setter ๋ฉ์๋๋ง ๊ฐ์ง๋ ๊ฐ์ฒด์ด๋ค.
-
DTO๋ฅผ ์ฌ์ฉํ๋ ์ด์ .
-
์ด๋ค ๊ฐ์ ์์ฒญํ ๋, ๊ทธ ์์ฒญํ ๊ฐ์ DTO์ ๋ด์ง ์๊ณ ์ผ์ผ์ด ํ๋์ฉ ์๋ตํด์ค๋ค๋ฉด, ๋คํธ์ํฌ์ ์์ฒญ๋๊ฒ ๋ง์ ํธ๋ํฝ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ์ ์ค์ด๊ธฐ ์ํจ.
-
@Vaild ์ด๋ ธํ ์ด์ ๊ณผ BindingResult ํด๋์ค ๊ทธ๋ฆฌ๊ณ DTO ํด๋์ค ๋ด์ ์๋ @NotEmpty, @NotNull, @Email ์ด๋ ธํ ์ด์ ์ ํตํด์ ํ์๊ฐ์ ์ ์ํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ํด์๋ ์ฌ์ฉํ์๋ค.
-
-
-
๊ณ์ ์์ฑ ์์ DB๋ฅผ ์กฐํํด์ ์์ด๋์ ์ด๋ฉ์ผ์ด ์ค๋ณต์ธ์ง ์๋์ง ์ค๋ณต ๊ฒ์ฌ ์ฒดํฌ.
- ์ด์์ด ์๋ค๋ฉด, UserRepository์ ์ ์ฅ.
-
๊ณ์ ์์ฑ ์ฑ๊ณต.
- ๋น๋ฐ๋ฒํธ๊ฐ ์ํธํ๋์ ์ ์ฅ๋๊ฒ์ ํ์ธ
-
์์ฑ๋ ๊ณ์ ์ ํตํด์ ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์ ์ฉ๋ ๋ก๊ทธ์ธ ๋ก์ง ๊ตฌ์ฑ.
-
๊ธฐ์กด์ UserService ํด๋์ค์ UserDetailsService ํด๋์ค๋ฅผ ์์.
-
loadUserByUsername(String username) ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ.
-
๋ก๊ทธ์ธ์ ํ ๋ ์ ๋ ฅํ username ๊ฐ์ ํตํด์ DB์์ ํ์ฌ ์ ์ ๋ฅผ ์ฐพ์์จ ํ, ์ ์ ํด๋์ค ์์ฑํ์ฌ ๋งคํ.
-
๋งคํ๋ ์ ์ ์ ROLE ํ๋์ ๊ดํ ๊ฐ์ ์ธํ ํ, ์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ ๊ณตํ๋ ์ ์ ๊ฐ์ฒด์ ํ๋ผ๋ฏธํฐ๋ก ์ ์ ์ ์์ด๋, ๋น๋ฐ๋ฒํธ, Roles์ ๋ฆฌ์คํธ๊น์ง ๋ฃ๊ณ ๋ฆฌํด.
-
-
SecurityConfig ํด๋์ค์์ configureGloba() ๋ฉ์๋์ ํจ์ค์๋ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ค.
-
SecurityConfig ํด๋์ค์์ configure() ๋ฉ์๋๋ฅผ ํตํด์ ๋ก๊ทธ์ธ์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ฅธ URL ๋งคํ์ ํตํด ๋ก๊ทธ์ธ ๊ณผ์ ๋ง๋ฌด๋ฆฌ.
-
์ฑ๊ณต์ ์ธ ๋ก๊ทธ์ธ์ ํ ๊ฒฝ์ฐ,
/list
๋ก ์ด๋๋์ด์ ToDoList์ View๋ฅผ ๋์ด์ค. -
ToDoList ์ชฝ์ ๋ก๊ทธ์์ ๋ฒํผ ์์ฑ.
- ๋ก๊ทธ์์ ๋ฒํผ์ ํตํด์ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ด๋.
-
404 ์๋ฌ ํ์ด์ง์ 500 ์๋ฌ ํ์ด์ง์ ๋ฐ๋ฅธ ๋ทฐ ์ด๋.
- ErroPagerController ํด๋์ค ์์ฑ ํ, ์๋ฌ ์์ธ ์ฒ๋ฆฌ ํ ์๋ฌ ๋ทฐ ๋งคํ.
-
์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ์ ํ์ ๋, ํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ธ์ ์์ ๋ถ๋ฌ์ค๊ธฐ.
-
๋ก๊ทธ์ธ์ด ์ฑ๊ณต ํ ์ดํ ToDoList View๊ฐ ํ๋ฉด ์ถ๋ ฅ ๋ ๋์ ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ๋ก ๊ธ์ ๋ฑ๋ก ํ ๋, ํ์ฌ ์ ์ ์ ๋ณด๋ฅผ ์ธ์ ์์ ๊ฐ์ ธ์์ผ ํ๋ค.
-
ToDoListController ํด๋์ค์์ /todolist URL์ ๋ํด์ GetMapping๊ณผ PostMapping์ ์งํํ๋ ๋ฉ์๋์์ ํ๋ผ๋ฏธํฐ๋ก @AuthenticationPrincipal ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ ๊ณตํ๋ ์ ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ค.
-
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ ์ ๊ฐ์ฒด์
.getUsername()
๋ฉ์๋๋ฅผ ํตํด์ ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ์ ์ ๋ณด๋ฅผ ์ธ์ ์์ ๋ถ๋ฌ์ฌ ์ ์๋ค.@Controller @RequestMapping("/todolist") public class ToDoListController { .... .... @GetMapping public String list(Model model, @AuthenticationPrincipal org.springframework.security.core.userdetails.User currentUser) { User user = userService.findUserId(currentUser.getUsername()); model.addAttribute("todoList", toDoListService.findToDoList(user)); return "todolist/list"; } @PostMapping public ResponseEntity<?> postToDoList(@RequestBody @Valid ToDoList toDoList, BindingResult result, @AuthenticationPrincipal org.springframework.security.core.userdetails.User currentUser) { if(result.hasErrors()) { userService.validation(result); } User user = userService.findUserId(currentUser.getUsername()); toDoListService.PostToDoList(toDoList, user); return new ResponseEntity<>("{}", HttpStatus.CREATED); } .... .... }
-
-
-
์ ํจ์ฑ ๊ฒ์ฆ์ ์ํ ์ฝ๋ ์ผ๋ถ ์์ .
-
UserDTO ํด๋์ค์์ ์ปฌ๋ผ๋ค์ ์ ์ธํด์คฌ๋
@NotEmpty
์ด๋ ธํ ์ด์ ์์@NotBlank
์ด๋ ธํ ์ด์ ์ผ๋ก ๋ณ๊ฒฝ.@NotEmpty
์ด๋ ธํ ์ด์ ์ ๊ฒฝ์ฐ, null ๊ฐ๊ณผ empty ๊ฐ์ ๊ฒ์ฆ์์ ํ์ฉํ์ง ์์ง๋ง, white space ๊ฐ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์,@NotBlank
์ด๋ ธํ ์ด์ ์ผ๋ก ๋ณ๊ฒฝ.
@NotNull
@NotEmpty
@NotBlank
null ํ์ฉํ์ง ์์ ํ์ฉํ์ง ์์ ํ์ฉํ์ง ์์ "" ํ์ฉ ํ์ฉํ์ง ์์ ํ์ฉํ์ง ์์ " "(space) ํ์ฉ ํ์ฉ ํ์ฉํ์ง ์์
-
-
User ํด๋์ค ์ปฌ๋ผ ์ผ๋ถ ์์ .
-
์ปฌ๋ผ์ผ๋ก ๋ค์ด๊ฐ๋ ํ๋๋ค์ ์ ์ฉ๋์ด์๋
@Column
์ด๋ ธํ ์ด์ ์ ์์ฑ๊ฐ์@Column(nullable = false)
์ผ๋ก ๋ณ๊ฒฝ. -
User ๋๋ฉ์ธ์ผ๋ก ์ธํด DB ํ ์ด๋ธ์ด ์์ฑ๋ ๋, null ์ด ๋์ด์ ์๋๋ ์ปฌ๋ผ๋ค์ ๋ํด์ Not Null ์ ์ฝ์ ๊ฑธ์ด์ฃผ๊ธฐ ์ํด์ nullable ์์ฑ๊ฐ์
@Column
์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํจ.
-
-
์ ํจ์ฑ ๊ฒ์ฆ์ ์ํ ์ฝ๋ ์ผ๋ถ ์ถ๊ฐ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฆ ๋ถ๋ถ ๋ง๋ฌด๋ฆฌ.
-
๊ธฐ์กด์ DTO ๊ฐ์ฒด๋จ์์ ์งํํ๋ ๊ฒ์ฆ์ ๋ ํด์ ํ๋ก ํธ ๋จ์์ ์ถ๊ฐ ๊ฒ์ฆ์ ์งํํ๊ธฐ ์ํด์ ํ๋ก ํธ ์ฝ๋ ์ถ๊ฐ.
-
ํ์๊ฐ์ ํ ๋ ์์ด๋์ ๋น๋ฐ๋ฒํธ ๊ธธ์ด์ ๋ํ ๊ฒ์ฆ ๋ฐ ์ด๋ฉ์ผ ํ์ ๊ฒ์ฆ ๋ถ๋ถ ์ถ๊ฐ.
-
๋ก๊ทธ์ธ์ ์งํํ ๋, ์์ด๋ ๊ธธ์ด์ ๋น๋ฐ๋ฒํธ ๊ธธ์ด๋ฅผ ํ๋ก ํธ ๋จ์์๋ ๊ฒ์ฆํ๋ ์ฝ๋ ์ถ๊ฐ.
-
๋ก๊ทธ์ธ ์คํจ์์ ๋ก๊ทธ์์์์๋ ๊ทธ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ html ํ๊ทธ ์ถ๊ฐ.
-
ํ์๊ฐ์ ์์ Register๋ฅผ ๋๋ฅด๊ธฐ ์ ์๋, ์์ด๋๊ฐ ์ค๋ณต์ธ์ง ์ด๋ฉ์ผ์ด ์ค๋ณต์ธ์ง ๋ทฐ๋ฅผ ํตํด์ ๋ํ๋ ์ ์๋๋ก ์ฝ๋ ์์ .
-
-
๋ถ๋ถ์ ํ ์คํธ ์ฝ๋ ์์ฑ ์์.
-
LoginControllerTests ํด๋์ค ์์ฑ.
-
Ajax ํน์ client์ Request๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํด์ WebApplicationContext ํด๋์ค์ MockMvc ํด๋์ค๋ฅผ ์ฌ์ฉ.
-
root url ์ ๊ทผ์์ get ๋งคํ ํ ์คํธ ์ฝ๋ ์์ฑ.
-
๋ก๊ทธ์ธ ํ์ด์ง ์ ๊ทผ์์ get ๋ฉํ ํ ์คํธ ์ฝ๋ ์์ฑ.
-
-
-
์ดํ์๋ ์ฌ๋ฌ ํ ์คํธ ์ฝ๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํด์ ์ถ๊ฐํ ์์ .
-
์์ค์ฝ๋ ํตํฉ.
-
๊ณ์ธตํ ToDoList ๊ตฌํํ๊ธฐ.
-
๊ณ์ธตํ ToDoList๋ฅผ ์ํ Coment ๋๋ฉ์ธ ์์ฑ.
-
idx(ํค)
->Long
-
content(๋ด์ฉ)
->String
-
createdDate(์์ฑ์๊ฐ)
->LocalDateTime
-
modifiedDate(์์ ์๊ฐ)
->LocalDateTime
-
-
Comment ๋๋ฉ์ธ์ ์์ฑํจ์ผ๋ก์จ CommentRepository, CommentController, CommentService ํด๋์ค ์์ฑ.
-
-
Comment ๋ฑ๋ก์ ์ํ View ์์ฑ
-
View์์ ๋ฐ์ดํฐ ๊ฐ์ ์ ์กํ๊ธฐ ์ํ, CommentDTO ํด๋์ค ์์ฑ.
-
๋๊ธ ๋ฑ๋ก ๋ฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ฐ ์ ์ฅ.
-
Comment ๋๋ฉ์ธ๊ณผ ToDoList ๋๋ฉ์ธ์ ๊ด๊ณ์ฑ ๋งคํ.
-
Comment ๋๋ฉ์ธ์์
@ManyToOne
๊ด๊ณ ๋งคํ. -
ToDoList ๋๋ฉ์ธ์์
@OneToMany
๊ด๊ณ ๋งคํ.
-
-
CommentController ํด๋์ค์์ ๋๊ธ ๋ฑ๋ก์ ์ํ Post ์์ฒญ ๋ฉ์๋ ์์ฑ.
-
Post ์์ฒญ ๋ฉ์๋ ๋ด์์ ๋ฑ๋ก์ ์ํ ๋น์ง๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋น์ค ํธ์ถ.
-
๋๊ธ ๋ฑ๋กํ ๋, ๋๊ธ์ ๋ฐ์ดํฐ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ํ, ์๋น์ค ํธ์ถ. (
validation()
) -
๊ฒ์ฆ์ด ๋๋ฌ๋ค๋ฉด,
@Builder
์ด๋ ธํ ์ด์ด์ ์ ์ด์ฉํ ๋น๋ ํจํด์ ์ด์ฉํด์ Comment ๊ฐ์ฒด ์์ฑ ํ, ToDoList์ add ๋ฉ์๋ ์คํ. -
๋ง์ง๋ง์ผ๋ก CommentRepository ์ ํ์ํ ๋ก์ง์ ์ฒ๋ฆฌํ Comment ๊ฐ์ฒด ์ ์ฅ.
-
๋๊ธ ๋ฑ๋ก View์์ AJAX ํธ์ถ์ ํตํด์ Post ๋ฉ์๋ ํธ์ถ์ ํ ๋ค, DB์ Comment ๊ฐ ์ ์ฅ์๋ฃ
-
-
-
์ฌ์ฉํ์ง ์์ css, js ํ์ผ ๋ชจ๋ ์ญ์ .
-
์ค๋ณต๋๋ ์ฝ๋ ๋ถ๋ถ๋ค์ ํ๋๋ก ํต์ผ.
-
๊น๋ํ ๋ทฐ๋ฅผ ์ํด์ html ๋ฐ css ๊ทธ๋ฆฌ๊ณ js ์ฝ๋ ๋ถ๋ถ ์์ .
-
๋๊ธ์ ์ ๋ ฅํ๋ฉด ์ ๋ ฅํ View๊ฐ DB ๊ฐ์ ์ ์ฅ ์ดํ, To Do List์ ์ถ๋ ฅ๋๋๋ก ์ค์ .
-
๋๊ธ ์์ ๋ฐ ์ญ์ ๊ตฌํ.
-
๋๊ธ ์์ ๋ฐ ์ญ์ ๋ฅผ ์ํ ๋น์ง๋์ค ๋ก์ง ์ถ๊ฐ ๋ฐ put ๋งคํ๊ณผ delete ๋งคํ ์ถ๊ฐ.
-
๋๊ธ ์์ ๋ฐ ์ญ์ ๋ฅผ ํ๊ธฐ ์ํด View์์ AJAX ํธ์ถ์ ํตํด์ put ๋๋ delete ๋ฉ์๋ ํธ์ถ์ ํ ๋ค, DB์ Comment ์์ ๋๋ ์ญ์ ์ ์ฉ.
-
-
๊ณ์ธตํ ToDo๋ก ์์ฑ๋ ๋๊ธ์ ๋ํด์๋ ์๋ฃ ์ฌ๋ถ์ ๋ํ ์ค์ ๊ฐ๋ฅ.
- Comment ๋๋ฉ์ธ์ Status ์ปฌ๋ผ ์ถ๊ฐ ๋ฐ ์ฒดํฌ ๋ฐ์ค ์ฌ๋ถ์ ๋ฐ๋ผ Status ๊ฐ์ด False ๋๋ True๋ก ๋ณ๊ฒฝ.
-
๊ณ์ธตํ ToDoList ์๋ฃ ์ฌ๋ถ ์ค์ ๋ฐ ์ปฌ๋ผ ์ถ๊ฐ.
-
๊ณ์ธตํ ToDoList ์ฝ์ , ์ญ์ , ์์ , ์๋ฃ์์ ํ์ด์ง๊ฐ Reload๊ฐ ๋์ด์ ์ ํ๋ ์ด์ ํด๊ฒฐ.
-
๋ฐ์ดํฐ๋ฅผ CommentDTO ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์๋ฒ์ ๋ณด๋ธ ๋ค, ๋ค์ CommentDTO๋ฅผ ๋ฐํ๋ฐ์์ ๊ทธ ๊ฐ์ฒด๋ฅผ ํ ๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ์์ฑ.
-
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑํ Comment ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ํ์ด์ง๋ฅผ ๋ฆฌ๋ก๋ ํ์ง ์๊ณ , ์ฝ์ , ์์ , ์ญ์ ํ ๋ก์ง์ ๋ฐ๋ฅธ, ๋ทฐ๋ฅผ ๋ฐ์.
-
-
ToDoList ์์ ์งํ์์, ์์ ๋ฒํผ ๋์์ธ ๋ณ๊ฒฝ ๋ฐ ๋ค๋ฅธ ์ญ์ , ์ฝ๋งจํธ, ์ฒดํฌ๋ฐ์ค ๋ฑ์ ๋ฒํผ๋ค์ ๋นํ์ฑํ ์ฒ๋ฆฌ.
-
๊ณ์ธตํ ToDoList ์์ ์์๋, ์์ ๋ฒํผ ๋์์ธ ๋ณ๊ฒฝ ๋ฐ ๋ค๋ฅธ ์ญ์ ๋ฐ ์ฒดํฌ๋ฐ์ค ๋ฒํผ ๋ค์ ๋นํ์ฑํ ์ฒ๋ฆฌ.
-
์ผ๋ถ HTML์ CSS ์์ฑ ๋ฐ View ๋ณ๊ฒฝ.
-
๊ฐ์ ์ฌํญ ๋ฐ ๋ชจ๋ ๋ฌธ์ ๋ค์ issue๋ก ๋ฑ๋กํด์ ๊ด๋ฆฌ.
-
๋ฑ๋ก๋ ์ด์๋ค์ ํ ๋๋ก ์ด์๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํ Branch ์์ฑ ํ, ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ, Master Branch๋ก Merge ํ๋ ๋ฐฉ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ ์์ ์.
-
UserDTO ํด๋์ค์ ์ ํจ์ฑ ๊ฒ์ฆ ์ด๋ ธํ ์ด์ ์ธ
@Pattern
์ด๋ ธํ ์ด์ ์ถ๊ฐ.- ํ ์คํธ ์ฝ๋๋ฅผ ์ํ ํ๊ฒ ๋์ํ๊ธฐ ์ํด์, ๊ธฐ์กด์ js๊ฐ ์ฒ๋ฆฌํด์ฃผ๋ ํ๋ก ํธ์์์ ๊ฒ์ฆ ๋ฟ๋ง ์๋๋ผ, ๋ฐฑ์ค๋์์๋ ์์ด๋ ๋ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฒ์ฆํด์ฃผ๊ธฐ ์ํด ์ถ๊ฐ.
-
#1 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
- #1 ์ด์์ธ ํ์๊ฐ์ ํ ์คํธ ์ฝ๋ ์์ฑ ์๋ฃ.
-
#3 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
-
#3 ์ด์์ธ ๋ก๊ทธ์ธ ํ ์คํธ ์ฝ๋ ์์ฑ ์๋ฃ.
-
๋ก๊ทธ์ธ ํ ์คํธ ์ฝ๋ ์์ฑ ์ค์ MockMvc๋ฅผ ์ด์ฉํ ์ฟ ํค ์ํ ๊ฐ์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋์ด์ ์ฟ ํค ๊ฐ ๊ฐฑ์ ํ ์คํธ๋ ์๋ฃํ์ง ๋ชปํ์์.
-
-
#5 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
-
#5 ์ด์์ธ ToDoList ํ ์คํธ ์ฝ๋ ์์ฑ ์๋ฃ.
-
ToDoList Get ์์ฒญ
/
,/todolist
์์ฒญ.
-
ToDo ๋ฑ๋ก
-
ToDo ๋ฌธ์์ด ๊ธธ์ด 0
- ToDo์ ์ต์ ๊ธธ์ด ๋ฏธ๋ฌ๋ก ๋ฑ๋ก ์คํจ.
-
ToDo ๋ฌธ์์ด ๊ธธ์ด 256
- ToDO์ ์ต๋ ๊ธธ์ด ์ด๊ณผ๋ก ๋ฑ๋ก ์คํจ.
-
ToDo ๋ฌธ์์ด ๊ธธ์ด 1 ~ 255
- ToDo์ ์ ํจํ ๋ฌธ์์ด ๊ธธ์ด ๋ฒ์์ด๋ฏ๋ก ๋ฑ๋ก ์ฑ๊ณต.
-
์ ์ ๋ฑ๋ก๋ ToDoList ๊ฐ์ฒด ๋น๊ต.
-
๋ฑ๋ก๋ ToDoList, ToDoList.CreatedDate -
NotNull
-
ToDoList.CompletedDate -
Null
-
ํ์ฌ ๋ก๊ทธ์ธํ User.Idx์ ToDoList๋ฅผ ๋ฑ๋กํ User์ Idx ์ผ์น.
-
-
-
ToDo ์๋ฃ.
-
ToDo ์์ฑ.
- ์์ฑ ์งํ, ToDo์ Status๋
false
, ToDo์ CompletedDate๋Null
- ์์ฑ ์งํ, ToDo์ Status๋
-
์์ฑ๋ ToDo ์๋ฃ ์ฒ๋ฆฌ,
put("/todolist/status/{idx}")
์์ฒญ.- ToDo์ Status๋
true
, ToDo์ CompletedDate๋LocalDateTime.now()
- ToDo์ Status๋
-
-
ToDo ์ญ์ .
-
ToDo ์์ฑ.
- ์์ฑ๋ ToDo ๊ฐ์ฒด๋
NotNull
- ์์ฑ๋ ToDo ๊ฐ์ฒด๋
-
ToDo ์ญ์ ์์ฒญ,
delete("/todolist/{idx}")
์์ฒญ.- ToDo ์ญ์ ํ์ธ(
Null
)
- ToDo ์ญ์ ํ์ธ(
-
-
ToDo ์์
-
ToDo ์์ฑ
- ToDo ๋ฑ๋ก ๋ด์ฉ ํ์ธ.
-
ToDo ์์ ์์ฒญ,
put("/todolist/{idx}")
์์ฒญ.-
๋ณ๊ฒฝ๋ description ์ ์ฅ.
-
DB์์ ๋ณ๊ฒฝ๋ description ํ์ธ.
-
-
-
-
-
#8 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
-
#8 ์ด์์ธ ๋ก๊ทธ์ธ ํ ์คํธ ์ฝ๋ ์์ฑ ์๋ฃ.
-
Comment ๋ฑ๋ก.
-
๋ฑ๋ก ์์ฒญ ์ฑ๊ณต ๋ฐ DB ๋ด ๋ฑ๋ก ์ฌ๋ถ ํ์ธ .
-
๋ด์ฉ ๋ฑ๋ก ์ ๊ธธ์ด(๋น ๋ฌธ์์ด, ์ต๋ ๊ธ์ ์ด๊ณผ) ๊ฒ์ฌ.
-
ToDo ์์ ๊ด๊ณ์ฑ ํ์ธ(ToDoListIdx์ ๋ํ List์ ๊ฐฏ์).
-
-
Comment ์๋ฃ.
- ์๋ฃ ์์ฒญ ์ฑ๊ณต ๋ฐ DB ๋ด ์ํ ๋ณ๊ฒฝ ๋ฐ ์๋ฃ ๋ ์ง ํ์ธ.
-
Comment ์์
-
๋ด์ฉ ๋ฑ๋ก ๊ธธ์ด(๋น ๋ฌธ์์ด, ์ต๋ ๊ธ์ ์ด๊ณผ) ๊ฒ์ฌ.
-
์์ ์์ฒญ ์ฑ๊ณต ๋ฐ DB ์์ ์์ ๋ด์ฉ ๋ฐ ์์ ๋ ์ง ํ์ธ.
-
-
Comment ์ญ์
- ์ญ์ ์์ฒญ ์ฑ๊ณต ๋ฐ DB ๋ด ์ญ์ ์ฌ๋ถ ํ์ธ.
-
-
#10 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
-
#10 ์ด์์ธ ์์ด๋, ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๊ธฐ๋ฅ ์ถ๊ฐ.
-
๋ก๊ทธ์ธ ํ์ด์ง ๋ทฐ ์ผ๋ถ ๋ณ๊ฒฝ
-
login.js
์์ฑ ํ, ๋ก๊ทธ์ธ ํ์ด์ง์์ ์ฒ๋ฆฌ๋๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ก์ง์login.js
ํ์ผ๋ก ์ฎ๊น. -
์์ด๋ ์ฐพ๊ธฐ.
-
๊ณ์ ์์ฑ ์ ๋ฑ๋กํ๋ ์ด๋ฉ์ผ์ ํตํด์ ์์ด๋ ์ฐพ๊ธฐ.
-
์ด๋ฉ์ผ์ด ์กด์ฌํ๋ฉด ์์ด๋๋ฅผ ์ด๋ฉ์ผ๋ก ์ ์ก.
-
์ด๋ฉ์ผ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ์์ด๋ ์ฐพ๊ธฐ ์คํจ.
-
-
-
๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ.
-
๊ณ์ ์์ฑ ์ ๋ฑ๋กํ๋ ์์ด๋์ ์ด๋ฉ์ผ์ ํตํด์ ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ.
-
์์ด๋์ ์ด๋ฉ์ผ์ด ์กด์ฌํ๊ณ ์ผ์นํ๋ฉด, ์ด๋ฉ์ผ์ ์ธ์ฆ๋ฒํธ๋ฅผ ์ ์ก ํ, ์ผ์นํ๋ฉด, ๋น๋ฐ๋ฒํธ๋ฅผ ์๋กญ๊ฒ ์ค์ .
-
์์ด๋์ ์ด๋ฉ์ผ์ด ๋ ์ค ํ๋๋ผ๋ ์กด์ฌํ์ง ์๊ฑฐ๋, ์์ด๋์ ์ด๋ฉ์ผ์ด ์ผ์น ํ์ง ์์์ ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ์คํจ.
-
-
-
-
#12 ์ด์ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ ์ฌํญ Master Branch๋ก ํฉ๋ณ.
- #12 ์ด์์ธ ๋น๋ฐ๋ฒํธ ์ฐพ๋ ๋ก์ง ๊ฐ์ ๋ฐ ์์ .
-
๋น๋ฐ๋ฒํธ ์ฐพ๋ ๋ก์ง ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์ฝ๋ ์ผ๋ถ ์์ .
-
์ธ์ฆ๋ฒํธ๋ฅผ ์ธ์ฆํ๊ธฐ ์ํด Map ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์์ผ๋, ์ด ๋ถ๋ถ๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ๋ก์ง ๋ณ๊ฒฝ.
-
๋น๋ฐ๋ฒํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์กํ๊ธฐ ์ํ, FindPasswordDTO ๊ฐ์ฒด๋ฅผ ์์ฑ.
-
LoginService ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ ๋, ์ค์ฝํ๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ฃผ์ง ์๊ณ , ์ธ์ ์ผ๋ก ์ฃผ์ด์ ์ ์ํ ์ธ์ ๋ง๋ค ๋น์ด ์์ฑ๋๋๋ก ๋ก์ง ๋ณ๊ฒฝ.
-
์ด๋ ๊ฒ ๋ณ๊ฒฝ ํ, ์ ์ํ ์ธ์ ์ ๋ฐ๋ผ์ LoginService ๋น์ด ์๋กญ๊ฒ ์ฃผ์ ๋๊ณ , ๊ฐ ์ธ์ ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ๋์ LoginService ๋น๋ค์ ์ฃผ์ ๋ฐ๋๋ค. ์ฆ, ์ ์ํ ์ ์ ๋ง๋ค ๋ค๋ฅธ LoginService ๋น๋ค์ ์ฃผ์ ๋ฐ๊ณ , ๊ทธ LoginService ๋น๋ค์ ์ด์ฉํด์ ๋น๋ฐ๋ฒํธ ๋ฐ ์์ด๋๋ฅผ ์ฐพ๋ ๋ก์ง์ ์ํํ๋ค.
-
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ ์ ๋ค๊ณผ LoginService ๋น์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ ์ผ์ด ์๊ธฐ ๋๋ฌธ์, ์ธ์ฆ ๋ก์ง์ด ๊ฐ ์ ์ ธ๋ณ๋ก(์ธ์ ๋ณ๋ก) ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋๋ค.
-
๋ ์ธ์ ์ด ์ข ๋ฃ๋๋ฉด(๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋๋ ๋ฑ) ํด๋น ์ธ์ ์ LoginService ๋น๋ ์๋ฉธํ๊ธฐ ๋๋ฌธ์, ๊ทธ ์์์ ์ฒ๋ฆฌ๋๋ ์ธ์ฆ ๋ฒํธ ๋ฐ ์ธ์ฆ ๋ก์ง๋ ์ ๋ถ ์๋ฉธํ๋ค.
- ์ธ์ฆ๋ฒํธ๋ฅผ ๋ฐ๊ณ , ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃ ํ, ๋ค์ ์ ์ํด์ ์ด์ ์ ๋ฐ์ ์ธ์ฆ๋ฒํธ๋ฅผ ์ด์ฉํ๋ ค ํ๋ฉด ์ธ์ฆ์ด ๋์ง ์๋๋ค.
-
-