Skip to content

donghL-dev/Project-ToDoList

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

91 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Prjoect - To Do List

  • 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

์ฃผ์š”๊ธฐ๋Šฅ

๊ฐœ๋ฐœ๊ณผ์ •

์„ธ๋ถ€์ •๋ณด

project-day-1

  • Spring-Boot-Web-TDL ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ.

  • ToDoList ํด๋ž˜์Šค ์„ค๊ณ„ ๋ฐ ์ƒ์„ฑ.

    • Idx(ํ‚ค) -> Integer

    • Description(๋‚ด์šฉ) -> String

    • Status(์™„๋ฃŒ ์—ฌ๋ถ€) -> Boolean

    • CreatedDate(์ƒ์„ฑ ์‹œ๊ฐ„) -> LocalDateTime

    • CompletedDate(์™„๋ฃŒ ์‹œ๊ฐ„) -> LocalDateTime

project-day-2

  • ํ”„๋กœ์ ํŠธ ํŒจํ‚ค์ง€ ์ƒ์„ฑ.

    • ๋„๋ฉ”์ธ, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํŒจํ‚ค์ง€ ์ƒ์„ฑ.
  • ํ”„๋กœ์ ํŠธ์™€ 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 ์—ฐ๋™

project-day-3

project-day-4

  • View ์ˆ˜์ • ๋ฐ ์—…๋ฐ์ดํŠธ

    • css ์„ค์ • ๊ฐ’ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •

    • Header์™€ Footer ์ƒ์„ฑ.

project-day-5

  • to do list ๋ชฉ๋ก์˜ CRUD๋ฅผ ์œ„ํ•œ ToDoListRestController ํด๋ž˜์Šค ์ƒ์„ฑ.

    • to do list ๋ชฉ๋ก์˜ ์ƒ์„ฑ์„ ์œ„ํ•œ ๊ฐ’์„ View์—์„œ Input์„ ํ†ตํ•ด ๋ฐ›์•„์˜ด.

    • ๋ฐ›์•„์˜จ Input๊ฐ’์„ postToDoList ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ PostMapping์œผ๋กœ url ๋งคํ•‘ ์ฒ˜๋ฆฌํ›„ ToDoListService์—์„œ ๋กœ์ง ์ฒ˜๋ฆฌ.

    • ToDoListService์—์„œ ๋กœ์ง์„ ํ†ตํ•ด DB์— ๊ฐ’์„ ์ €์žฅ ํ•œ ๋’ค View๊ฐ€ Redirect ๋œ ํ›„ ์ €์žฅ๋œ ๋ชฉ๋ก ์ถœ๋ ฅ.

project-day-6

  • to do list ๋ชฉ๋ก์˜ ์‚ญ์ œ ๊ธฐ๋Šฅ๊ณผ ์ƒํƒœ์™€ ๋‚ด์šฉ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    • ์‚ญ์ œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ @PathVariable๋ฅผ ํ†ตํ•ด์„œ idx ๊ฐ’์„ ๋ฐ›์•„์˜จ ๋’ค DeleteMapping์œผ๋กœ ๋งคํ•‘์‹œํ‚จ ๋’ค, deleteToDoList ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋กœ์ง ์ฒ˜๋ฆฌ.

    • ์ƒํƒœ์™€ ๋‚ด์šฉ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด์„œ @PathVariable๋ฅผ ํ†ตํ•ด์„œ idx ๊ฐ’์„ ๋ฐ›์•„์˜จ ๋’ค PutMapping์œผ๋กœ ๋งคํ•‘์‹œํ‚จ ๋’ค, putDescription, putStatus ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋กœ์ง ์ฒ˜๋ฆฌ.

  • ๊ธฐ์กด์˜ View์—์„œ ์—…๋ฐ์ดํŠธ

project-day-7

  • 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 ๊ฐ์ฒด ๊ฐ’ ์ €์žฅ.

project-day-8

  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

    • ๋กœ๊ทธ์ธ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ LoginController ํด๋ž˜์Šค ์ƒ์„ฑ

    • ๋กœ๊ทธ์ธ ๋ทฐ ์ƒ์„ฑ.

  • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

    • ํšŒ์›๊ฐ€์ž… ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ RegisterController ํด๋ž˜์Šค ์ƒ์„ฑ

    • ํšŒ์›๊ฐ€์ž… ๋ทฐ ์ƒ์„ฑ.

  • ํšŒ์›๊ฐ€์ž… ํ™•์ธ

    • Username, Email, Password Ajax ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, ๋ฐ์ดํ„ฐ ์ „์†ก.

    • ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ›์•„์™€์„œ ํšŒ์›๊ฐ€์ž… ๋กœ์ง์„ ํ†ตํ•ด ์œ ์ €์— ํ•„์š”ํ•œ ๊ฐ’์„ ์ €์žฅ ํ›„, ์œ ์ € ์ƒ์„ฑ.

  • ๋กœ๊ทธ์ธ ํ™•์ธ

    • Username, Password Ajax ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, ๋ฐ์ดํ„ฐ ์ „์†ก.

    • loginUser ํ•จ์ˆ˜ ์ƒ์„ฑ ํ›„, ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ›์•„์˜จ ํ›„ ๋กœ๊ทธ์ธ ์ฒดํฌ.

      • Username์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋กœ๊ทธ์ธ ์‹คํŒจ.

      • Username์ด ์กด์žฌํ•  ๊ฒฝ์šฐ, password๊ฐ€ ์ผ์น˜ ํ•˜์ง€ ์•Š์„์‹œ ๋กœ๊ทธ์ธ ์‹คํŒจ.

      • Username์ด ์กด์žฌํ•  ๊ฒฝ์šฐ, password๊ฐ€ ์ผ์น˜ํ•˜๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์„ฑ๊ณต.

project-day-9

  • ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š๊ณ  To Do List url๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ, ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ redirect ๋˜๋„๋ก ์„ค์ •.

  • To Do List์— ํ˜„์žฌ ๋กœ๊ทธ์ธ์„ ํ•œ ์œ ์ €๊ฐ€ ๋“ฑ๋กํ•œ To Do ํ•ญ๋ชฉ๊ณผ Complete ํ•ญ๋ชฉ์ด ๋ณด์ด๋„๋ก ์„ค์ •.

  • To Do๊ฐ€ ๋“ฑ๋ก๋  ๋•Œ, DB์˜ To Do List์˜ ํ…Œ์ด๋ธ”์—๋„ ํ˜„์žฌ ๋กœ๊ทธ์ธ ํ•œ ์œ ์ €์˜ Idx๊ฐ€ ์ €์žฅ๋จ.

project-day-10

  • User ๋ชจ๋ธ ๊ฐ์ฒด์™€ ToDoList ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„์—์„œ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋กœ ์žฌ์„ค์ •.

    • @OneToMany ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„์„ฑ ์žฌ์„ค์ •.

    • Foreign Key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  OwnerShip์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ธ ๊ฐ์ฒด์— @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ.

    • OwnerShip์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๋ชจ๋ธ ๊ฐ์ฒด์— @OneToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ.

    • @OneToMany๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋ธ ๊ฐ์ฒด์— @OneToMany ์–ด๋…ธํ…Œ์ด์…˜์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜์ธ mappedby๋กœ OwnerShip์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ช…์„ ๊ธฐ์ž…ํ•œ๋‹ค.

    • OwnerShip์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๋ชจ๋ธ ๊ฐ์ฒด์—๋Š” OwnerShip์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ธ ๊ฐ์ฒด๋กœ ๋œ ํ•„๋“œ๋ฅผ Collection ์ž๋ฃŒํ˜•์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.

  • ToDoList ๋ชจ๋ธ์— @ManyToOne ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ , User ๋ชจ๋ธ์— @OneToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ N : 1 ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋กœ ์„ค์ •.

  • ํ…Œ์ด๋ธ” ๋ฐ ์ฝ”๋“œ ํ™•์ธ

project-day-11

  • ํ˜„์žฌ 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);
      }
    }

prjoect-day-12

  • /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 ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์ฝ”๋”ฉ ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋ถ€๋ถ„์„ ํ•ด๊ฒฐ.

prjoect-day-13

  • 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 ์œผ๋กœ ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์˜€๋‹ค.

prjoect-day-14

  • 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์„ ๊ฐ€์ง„ ์œ ์ €๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹จ ์˜๋ฏธ๊ฐ€ ๋จ.

prjoect-day-15

  • 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);
          }
        
          ....
          ....
        
        }

prjoect-day-16

  • ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ฝ”๋“œ ์ผ๋ถ€ ์ˆ˜์ •.

    • 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 ์–ด๋…ธํ…Œ์ด์…˜์— ์ถ”๊ฐ€ํ•จ.

prjoect-day-17

  • ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ฝ”๋“œ ์ผ๋ถ€ ์ถ”๊ฐ€ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ถ€๋ถ„ ๋งˆ๋ฌด๋ฆฌ.

    • ๊ธฐ์กด์˜ DTO ๊ฐ์ฒด๋‹จ์—์„œ ์ง„ํ–‰ํ•˜๋˜ ๊ฒ€์ฆ์— ๋” ํ•ด์„œ ํ”„๋ก ํŠธ ๋‹จ์—์„œ ์ถ”๊ฐ€ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋ก ํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€.

    • ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธธ์ด์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ฐ ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ ๋ถ€๋ถ„ ์ถ”๊ฐ€.

    • ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•  ๋•Œ, ์•„์ด๋”” ๊ธธ์ด์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธธ์ด๋ฅผ ํ”„๋ก ํŠธ ๋‹จ์—์„œ๋„ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ ์ถ”๊ฐ€.

    • ๋กœ๊ทธ์ธ ์‹คํŒจ์‹œ์™€ ๋กœ๊ทธ์•„์›ƒ์‹œ์—๋„ ๊ทธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” html ํƒœ๊ทธ ์ถ”๊ฐ€.

    • ํšŒ์›๊ฐ€์ž…์‹œ์— Register๋ฅผ ๋ˆ„๋ฅด๊ธฐ ์ „์—๋„, ์•„์ด๋””๊ฐ€ ์ค‘๋ณต์ธ์ง€ ์ด๋ฉ”์ผ์ด ์ค‘๋ณต์ธ์ง€ ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์ˆ˜์ •.

prjoect-day-18

  • ๋ถ€๋ถ„์  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์ž‘.

    • LoginControllerTests ํด๋ž˜์Šค ์ƒ์„ฑ.

      • Ajax ํ˜น์€ client์˜ Request๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ WebApplicationContext ํด๋ž˜์Šค์™€ MockMvc ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ.

      • root url ์ ‘๊ทผ์‹œ์˜ get ๋งคํ•‘ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ.

      • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ ‘๊ทผ์‹œ์˜ get ๋ฉ”ํ•‘ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ.

  • ์ดํ›„์—๋„ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ž‘์„ฑํ•ด์„œ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •.

prjoect-day-19

  • ์†Œ์Šค์ฝ”๋“œ ํ†ตํ•ฉ.

  • ๊ณ„์ธตํ˜• 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 ๊ฐ’ ์ €์žฅ์™„๋ฃŒ

prjoect-day-20

  • ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ css, js ํŒŒ์ผ ๋ชจ๋‘ ์‚ญ์ œ.

  • ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„๋“ค์€ ํ•˜๋‚˜๋กœ ํ†ต์ผ.

  • ๊น”๋”ํ•œ ๋ทฐ๋ฅผ ์œ„ํ•ด์„œ html ๋ฐ css ๊ทธ๋ฆฌ๊ณ  js ์ฝ”๋“œ ๋ถ€๋ถ„ ์ˆ˜์ •.

  • ๋Œ“๊ธ€์„ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅํ•œ View๊ฐ€ DB ๊ฐ’์— ์ €์žฅ ์ดํ›„, To Do List์— ์ถœ๋ ฅ๋˜๋„๋ก ์„ค์ •.

  • ๋Œ“๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ๊ตฌํ˜„.

    • ๋Œ“๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๋ฅผ ์œ„ํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง ์ถ”๊ฐ€ ๋ฐ put ๋งคํ•‘๊ณผ delete ๋งคํ•‘ ์ถ”๊ฐ€.

    • ๋Œ“๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด View์—์„œ AJAX ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ put ๋˜๋Š” delete ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ํ•œ ๋’ค, DB์— Comment ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œ ์ ์šฉ.

  • ๊ณ„์ธตํ˜• ToDo๋กœ ์ž‘์„ฑ๋œ ๋Œ“๊ธ€์— ๋Œ€ํ•ด์„œ๋„ ์™„๋ฃŒ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์„ค์ • ๊ฐ€๋Šฅ.

    • Comment ๋„๋ฉ”์ธ์— Status ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ๋ฐ ์ฒดํฌ ๋ฐ•์Šค ์—ฌ๋ถ€์— ๋”ฐ๋ผ Status ๊ฐ’์ด False ๋˜๋Š” True๋กœ ๋ณ€๊ฒฝ.

prjoect-day-21

  • ๊ณ„์ธตํ˜• ToDoList ์™„๋ฃŒ ์—ฌ๋ถ€ ์„ค์ • ๋ฐ ์ปฌ๋Ÿผ ์ถ”๊ฐ€.

  • ๊ณ„์ธตํ˜• ToDoList ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ •, ์™„๋ฃŒ์‹œ์— ํŽ˜์ด์ง€๊ฐ€ Reload๊ฐ€ ๋˜์–ด์„œ ์ ‘ํžˆ๋Š” ์ด์Šˆ ํ•ด๊ฒฐ.

    • ๋ฐ์ดํ„ฐ๋ฅผ CommentDTO ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„์— ๋ณด๋‚ธ ๋’ค, ๋‹ค์‹œ CommentDTO๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„์„œ ๊ทธ ๊ฐ์ฒด๋ฅผ ํ† ๋Œ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ์ƒ์„ฑ.

    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ƒ์„ฑํ•œ Comment ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œ ํ•˜์ง€ ์•Š๊ณ , ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ํ•œ ๋กœ์ง์— ๋”ฐ๋ฅธ, ๋ทฐ๋ฅผ ๋ฐ˜์˜.

prjoect-day-22

  • ToDoList ์ˆ˜์ • ์ง„ํ–‰์‹œ์—, ์ˆ˜์ • ๋ฒ„ํŠผ ๋””์ž์ธ ๋ณ€๊ฒฝ ๋ฐ ๋‹ค๋ฅธ ์‚ญ์ œ, ์ฝ”๋งจํŠธ, ์ฒดํฌ๋ฐ•์Šค ๋“ฑ์˜ ๋ฒ„ํŠผ๋“ค์„ ๋น„ํ™œ์„ฑํ™” ์ฒ˜๋ฆฌ.

  • ๊ณ„์ธตํ˜• ToDoList ์ˆ˜์ •์‹œ์—๋„, ์ˆ˜์ • ๋ฒ„ํŠผ ๋””์ž์ธ ๋ณ€๊ฒฝ ๋ฐ ๋‹ค๋ฅธ ์‚ญ์ œ ๋ฐ ์ฒดํฌ๋ฐ•์Šค ๋ฒ„ํŠผ ๋“ค์„ ๋น„ํ™œ์„ฑํ™” ์ฒ˜๋ฆฌ.

  • ์ผ๋ถ€ HTML์˜ CSS ์†์„ฑ ๋ฐ View ๋ณ€๊ฒฝ.

prjoect-day-23

  • ๊ฐœ์„ ์‚ฌํ•ญ ๋ฐ ๋ชจ๋“  ๋ฌธ์ œ๋“ค์€ issue๋กœ ๋“ฑ๋กํ•ด์„œ ๊ด€๋ฆฌ.

  • ๋“ฑ๋ก๋œ ์ด์Šˆ๋“ค์„ ํ† ๋Œ€๋กœ ์ด์Šˆ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Branch ์ƒ์„ฑ ํ›„, ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, Master Branch๋กœ Merge ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž„.

  • UserDTO ํด๋ž˜์Šค์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์–ด๋…ธํ…Œ์ด์…˜์ธ @Pattern ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€.

    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์›ํ• ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๊ธฐ์กด์˜ js๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ฃผ๋˜ ํ”„๋ก ํŠธ์—์„œ์˜ ๊ฒ€์ฆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฐฑ์•ค๋“œ์—์„œ๋„ ์•„์ด๋”” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€.
  • #1 ์ด์Šˆ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ Master Branch๋กœ ํ•ฉ๋ณ‘.

    • #1 ์ด์Šˆ์ธ ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ.

prjoect-day-24

  • #3 ์ด์Šˆ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ Master Branch๋กœ ํ•ฉ๋ณ‘.

    • #3 ์ด์Šˆ์ธ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ.

    • ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์ค‘์— MockMvc๋ฅผ ์ด์šฉํ•œ ์ฟ ํ‚ค ์ƒํƒœ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์•ˆ๋˜์–ด์„œ ์ฟ ํ‚ค ๊ฐ’ ๊ฐฑ์‹  ํ…Œ์ŠคํŠธ๋Š” ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜์˜€์Œ.

prjoect-day-25

  • #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 ์™„๋ฃŒ ์ฒ˜๋ฆฌ, put("/todolist/status/{idx}") ์š”์ฒญ.

          • ToDo์˜ Status๋Š” true, ToDo์˜ CompletedDate๋Š” LocalDateTime.now()
      • ToDo ์‚ญ์ œ.

        • ToDo ์ƒ์„ฑ.

          • ์ƒ์„ฑ๋œ ToDo ๊ฐ์ฒด๋Š” NotNull
        • ToDo ์‚ญ์ œ ์š”์ฒญ, delete("/todolist/{idx}") ์š”์ฒญ.

          • ToDo ์‚ญ์ œ ํ™•์ธ(Null)
      • ToDo ์ˆ˜์ •

        • ToDo ์ƒ์„ฑ

          • ToDo ๋“ฑ๋ก ๋‚ด์šฉ ํ™•์ธ.
        • ToDo ์ˆ˜์ • ์š”์ฒญ, put("/todolist/{idx}") ์š”์ฒญ.

          • ๋ณ€๊ฒฝ๋œ description ์ €์žฅ.

          • DB์—์„œ ๋ณ€๊ฒฝ๋œ description ํ™•์ธ.

prjoect-day-26

  • #8 ์ด์Šˆ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ Master Branch๋กœ ํ•ฉ๋ณ‘.

    • #8 ์ด์Šˆ์ธ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ.

    • Comment ๋“ฑ๋ก.

      • ๋“ฑ๋ก ์š”์ฒญ ์„ฑ๊ณต ๋ฐ DB ๋‚ด ๋“ฑ๋ก ์—ฌ๋ถ€ ํ™•์ธ .

      • ๋‚ด์šฉ ๋“ฑ๋ก ์‹œ ๊ธธ์ด(๋นˆ ๋ฌธ์ž์—ด, ์ตœ๋Œ€ ๊ธ€์ž ์ดˆ๊ณผ) ๊ฒ€์‚ฌ.

      • ToDo ์™€์˜ ๊ด€๊ณ„์„ฑ ํ™•์ธ(ToDoListIdx์— ๋Œ€ํ•œ List์˜ ๊ฐฏ์ˆ˜).

    • Comment ์™„๋ฃŒ.

      • ์™„๋ฃŒ ์š”์ฒญ ์„ฑ๊ณต ๋ฐ DB ๋‚ด ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฐ ์™„๋ฃŒ ๋‚ ์งœ ํ™•์ธ.
    • Comment ์ˆ˜์ •

      • ๋‚ด์šฉ ๋“ฑ๋ก ๊ธธ์ด(๋นˆ ๋ฌธ์ž์—ด, ์ตœ๋Œ€ ๊ธ€์ž ์ดˆ๊ณผ) ๊ฒ€์‚ฌ.

      • ์ˆ˜์ • ์š”์ฒญ ์„ฑ๊ณต ๋ฐ DB ์•ˆ์˜ ์ˆ˜์ • ๋‚ด์šฉ ๋ฐ ์ˆ˜์ • ๋‚ ์งœ ํ™•์ธ.

    • Comment ์‚ญ์ œ

      • ์‚ญ์ œ ์š”์ฒญ ์„ฑ๊ณต ๋ฐ DB ๋‚ด ์‚ญ์ œ ์—ฌ๋ถ€ ํ™•์ธ.

prjoect-day-27

  • #10 ์ด์Šˆ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ Master Branch๋กœ ํ•ฉ๋ณ‘.

    • #10 ์ด์Šˆ์ธ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€.

    • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ทฐ ์ผ๋ถ€ ๋ณ€๊ฒฝ

    • login.js ์ƒ์„ฑ ํ›„, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์ฒ˜๋ฆฌ๋˜๋˜ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋กœ์ง์„ login.js ํŒŒ์ผ๋กœ ์˜ฎ๊น€.

    • ์•„์ด๋”” ์ฐพ๊ธฐ.

      • ๊ณ„์ • ์ƒ์„ฑ ์‹œ ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฉ”์ผ์„ ํ†ตํ•ด์„œ ์•„์ด๋”” ์ฐพ๊ธฐ.

        • ์ด๋ฉ”์ผ์ด ์กด์žฌํ•˜๋ฉด ์•„์ด๋””๋ฅผ ์ด๋ฉ”์ผ๋กœ ์ „์†ก.

        • ์ด๋ฉ”์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„์ด๋”” ์ฐพ๊ธฐ ์‹คํŒจ.

    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ.

      • ๊ณ„์ • ์ƒ์„ฑ ์‹œ ๋“ฑ๋กํ–ˆ๋˜ ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์„ ํ†ตํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ.

        • ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์ด ์กด์žฌํ•˜๊ณ  ์ผ์น˜ํ•˜๋ฉด, ์ด๋ฉ”์ผ์— ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ „์†ก ํ›„, ์ผ์น˜ํ•˜๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์„ค์ •.

        • ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์ด ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์ด ์ผ์น˜ ํ•˜์ง€ ์•Š์„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ์‹คํŒจ.

prjoect-day-28

  • #12 ์ด์Šˆ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐœ์„ ์‚ฌํ•ญ Master Branch๋กœ ํ•ฉ๋ณ‘.

    • #12 ์ด์Šˆ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๋Š” ๋กœ์ง ๊ฐœ์„  ๋ฐ ์ˆ˜์ •.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๋Š” ๋กœ์ง ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์ฝ”๋“œ ์ผ๋ถ€ ์ˆ˜์ •.

    • ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด Map ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜, ์ด ๋ถ€๋ถ„๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ง ๋ณ€๊ฒฝ.

    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ, FindPasswordDTO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ.

    • LoginService ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ๋•Œ, ์Šค์ฝ”ํ”„๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ฃผ์ง€ ์•Š๊ณ , ์„ธ์…˜์œผ๋กœ ์ฃผ์–ด์„œ ์ ‘์†ํ•œ ์„ธ์…˜๋งˆ๋‹ค ๋นˆ์ด ์ƒ์„ฑ๋˜๋„๋ก ๋กœ์ง ๋ณ€๊ฒฝ.

      • ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ ํ›„, ์ ‘์†ํ•œ ์„ธ์…˜์— ๋”ฐ๋ผ์„œ LoginService ๋นˆ์ด ์ƒˆ๋กญ๊ฒŒ ์ฃผ์ž…๋˜๊ณ , ๊ฐ ์„ธ์…˜์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ LoginService ๋นˆ๋“ค์„ ์ฃผ์ž… ๋ฐ›๋Š”๋‹ค. ์ฆ‰, ์ ‘์†ํ•œ ์œ ์ €๋งˆ๋‹ค ๋‹ค๋ฅธ LoginService ๋นˆ๋“ค์„ ์ฃผ์ž…๋ฐ›๊ณ , ๊ทธ LoginService ๋นˆ๋“ค์„ ์ด์šฉํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์•„์ด๋””๋ฅผ ์ฐพ๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

      • ๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์—, ๋‹ค๋ฅธ ์œ ์ €๋“ค๊ณผ LoginService ๋นˆ์„ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ธ์ฆ ๋กœ์ง์ด ๊ฐ ์œ ์ ธ๋ณ„๋กœ(์„ธ์…˜๋ณ„๋กœ) ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

      • ๋˜ ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด(๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๋“ฑ) ํ•ด๋‹น ์„ธ์…˜์˜ LoginService ๋นˆ๋„ ์†Œ๋ฉธํ•˜๊ธฐ ๋–„๋ฌธ์—, ๊ทธ ์•ˆ์—์„œ ์ฒ˜๋ฆฌ๋˜๋˜ ์ธ์ฆ ๋ฒˆํ˜ธ ๋ฐ ์ธ์ฆ ๋กœ์ง๋„ ์ „๋ถ€ ์†Œ๋ฉธํ•œ๋‹ค.

        • ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›๊ณ , ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒ ํ›„, ๋‹ค์‹œ ์ ‘์†ํ•ด์„œ ์ด์ „์— ๋ฐ›์€ ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•˜๋ ค ํ•˜๋ฉด ์ธ์ฆ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์ดํ›„๋ถ€ํ„ฐ๋Š” Issues์—์„œ ์—…๋ฐ์ดํŠธ ์‚ฌํ•ญ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.