
์๋ฐ์ ์์(Inheritance)์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ํต์ฌ ๊ฐ๋ ์ค ํ๋๋ก, ๊ธฐ์กด ํด๋์ค(๋ถ๋ชจ ํด๋์ค)์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์๋ก์ด ํด๋์ค(์์ ํด๋์ค)๊ฐ ๋ฌผ๋ ค๋ฐ์ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ํ์ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ๊ตฌ์กฐ์ ์ด๊ณ ์ ์ง๋ณด์ํ

์ค๋ฒ๋ก๋ฉ์ด๋ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๋งค๊ฐ๋ณ์์ ํ์ , ๊ฐ์, ์์๋ฅผ ๋ค๋ฅด๊ฒ ์ ์ํ์ฌ ํ๋์ ์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ค๋ฒ๋ก๋ฉ์ ์๋ฐ์ ๋คํ์ฑ(Polymorphism)์ ์ง์ํ๋ ์ค์ํ ๊ฐ๋ ์ด๋ค.์ฌ๊ธฐ์ ๋คํ์ฑ์ด๋? ๋คํ์ฑ(polymor

์๋ฐ์์๋ ํ์ผ์ด๋ ์ฝ์์ ์ ์ถ๋ ฅ์ ์ง์ ๋ค๋ฃจ์ง ์๊ณ , ์คํธ๋ฆผ(stream)์ด๋ผ๋ ํ๋ฆ์ ํตํด ๋ค๋ฃน๋๋ค. ์คํธ๋ฆผ์ด๋ ์ค์ ์ ์ ๋ ฅ์ด๋ ์ถ๋ ฅ์ด ํํ๋ ๋ฐ์ดํฐ์ ์ด์ํ๋ ํ๋ฆ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์คํธ๋ฆผ์ ์ด์์ฒด์ ์ ์ํด ์์ฑ๋๋ ๊ฐ์์ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ฅผ ์๋ฏธํ๋ฉฐ, ์ค๊ฐ ๋งค๊ฐ์ ์ญ

์๋ฐ์ Controller, Service, Repository ๊ตฌ์กฐ์ ๋ํ ์ดํด > Java ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ Controller-Service-Repository ๊ตฌ์กฐ๋ ๋ ์ด์ด๋ ์ํคํ ์ฒ(Layered Architecture)์ ๋ํ์ ์ธ ํํ๋ค. ์ด ๊ตฌ์กฐ

์๋ฐ Controller, Service, Repository ๊ตฌ์กฐ (1) ์์ ์ ๋ชจ๋ฅด๋ ๊ฐ๋ , ์ฉ์ด๋ค์ด ๋์์ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฆฌํ ํ์๊ฐ ์๋ค๊ณ ๋๊ผ๋ค. https://velog.io/@davinyakma/[TIL] ์๋ฐ Controller, Service, Rep

MySQL == MariaDB๋ค๋ฅธ DBMS๋ก๋ ์ค๋ผํด, MSSQL ๋ฑ์ด ์์ต๋๋ค.MySQL์ DBMS ์ ๋๋ค.MySQL์ ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ DBMS ์ ๋๋ค.DBMS == DataBase Management SystemDBMS๋ ์ฌ๋ฌ๊ฐ์ DB๋ฅผ ๊ด๋ฆฌํ๋ ์์ค

DBMS (Database Management System)๋? DBMS๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Database)๋ฅผ ์์ฑ, ๊ด๋ฆฌ ๋ฐ ์กฐ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ํํธ์จ์ด ์์คํ ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ , ๊ฒ์ํ๋ฉฐ, ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค. DBMS์ ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ์ด

CHAR(100)์ผ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ณ ์ ๊ธธ์ด: name ํ๋๊ฐ 100๋ฐ์ดํธ๋ก ํญ์ ๊ณ ์ ๋ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.๋ฐ์ดํฐ ์ ์ฅ ์์:์ด๋ฆ์ด "ํ๊ธธ๋"์ด๋ฉด 'ํ๊ธธ๋' + 97๊ฐ์ ๊ณต๋ฐฑ์ ์ ์ฅํฉ๋๋ค.์ ์ฅ ๊ณต๊ฐ: name ํ๋๋น 100๋ฐ์ดํธ.VARCHAR(100)์ผ ๋์ ๋ฉ๋ชจ๋ฆฌ

๊ฒ์์์ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ ๋ฆฌํด์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๊ฒ ํด์ฃผ๋ ์์คํ .์ฐ๋ฆฌ๊ฐ ์ธํฐ๋ท์์ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ ๋, ๊ฒ์์์ง์ด ํ์ํ ์ ๋ณด๋ง ๊ณจ๋ผ์ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํจ.ํฌ๋กค๋ง: ์น์ฌ์ดํธ๋ฅผ ๋์๋ค๋๋ฉฐ ์ ๋ณด ์์ง.์ธ๋ฑ์ฑ: ์์งํ ์ ๋ณด๋ฅผ ์ ๋ฆฌํ๊ณ ์ ์ฅ. ๊ฒ์ํ ๋ ๋น ๋ฅด๊ฒ

์๋ธ์ฟผ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ? ์๋ธ์ฟผ๋ฆฌ(Subquery)๋ ํ๋์ SQL ์ฟผ๋ฆฌ ์์ ์ค์ฒฉ๋ ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ ์ฟผ๋ฆฌ(Main Query)์ ์ ๋ ฅ๊ฐ์ ์ ๊ณตํ๊ฑฐ๋ ํํฐ๋ง ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ SELECT, FROM, WHERE ์ ์์ ์ฌ์ฉ๋

Spring Boot๋ Java ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋, ๋ค์ํ ์ด๋ ธํ ์ด์ ์ ํตํด ๊ฐ๋ฐ์์ ์์ ์ ๊ฐ์ํํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ญ๋๋ค.์ด๋ฒ ๊ธ์์๋ Spring Boot์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ฃผ์ ์ด๋ ธํ ์ด์ ๋ค์ ์๊ฐํ๊ณ , ๊ฐ ์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ ์์์ ํจ๊ป ๋ณด๋ ค๊ณ

JPQL์ Java์ ORM(Object Relational Mapping) ํ๋ ์์ํฌ์ธ JPA(Java Persistence API)์์ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. SQL๊ณผ ๋น์ทํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์๋ ์๋ฐ ๊ฐ์ฒด(Entity)๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋

์ ์: ํ๋์ ์์ ๋จ์(์์ ์ ๋ฌถ์)๋ก ๊ฐ์ฃผ๋์ด, ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ๋ชจ๋ ์คํจํด์ผ ํ๋ ์์ ์ ์๋ฏธํฉ๋๋ค.ํน์ง (ACID):์์์ฑ(Atomicity): ์์ ์ด ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋, ๋ชจ๋ ๋กค๋ฐฑ(์คํจ)ํด์ผ ํจ.์ผ๊ด์ฑ(Consistency): ํธ๋์ญ์ ์ด ์๋ฃ๋ ํ ๋ฐ์ดํฐ๊ฐ ํญ์

Spring Data JPA: ํจ๊ณผ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ํ ํ์ ๋๊ตฌ Spring Data JPA๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์ ๋๋ค. 1๏ธโฃ JPA๋? Java Persistence A

์ฐธ๊ณ ๋ธ๋ก๊ทธ @ManyToMany๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ ์ด์ @ManyToMany, @OneToMany, @ManyToOne๊ด๊ณ ์์ฑํ๊ธฐ [[JPA] ๋ค๋๋ค N : N ๊ด๊ณ ํ์ด๋ด๊ธฐ (์ค๊ฐ ํ ์ด๋ธ ์์ฑ)](https://rachel0115.tistory.com/entr

Thymeleaf(ํ์๋ฆฌํ)๋ Java ๊ธฐ๋ฐ ํ ํ๋ฆฟ ์์ง์ผ๋ก, ์๋ฒ์์ HTML, XML, JavaScript, CSS ๋ฑ์ ๋ ๋๋งํ์ฌ ํ๋ฉด์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.Spring Boot์์ ๊ฐ๋ ฅํ ํตํฉ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.ํ์๋ฆฌํ๋ ์

REST API๋ Representational State Transfer (REST) ์ํคํ ์ฒ ์คํ์ผ์ ๋ฐ๋ฅด๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค(API)์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ, ์ฃผ๋ก HTTP๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.REST๋ ๋ฆฌ์์ค๋ฅผ

๐จ ๋ถํธ์คํธ๋ฉ(Bootstrap)์ด๋? ๋ถํธ์คํธ๋ฉ(Bootstrap)์ ํธ์ํฐ ๊ฐ๋ฐ์๋ค์ด ๋ง๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ฉ ์คํ์์ค ํ๋ ์์ํฌ๋ก, ์น ํ์ด์ง์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ UI(User Interface)๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ค๋๋ค. HTML, CSS,

๐ N + 1 ๋ฌธ์ ๋ ๋ฌด์์ธ๊ฐ? ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด "N + 1 ๋ฌธ์ "๋ผ๋ ์ฉ์ด๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ๋ก JPA์ ๊ฐ์ ORM(Object Relational Mapping) ๊ธฐ์ ์ ์ฌ์ฉํ ๋ ๋ฐ์ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด, ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ ํ์ํ

๐ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization) ๊ฐ๋ฐ์ ํ๋ฉด์ "์ธ์ฆ"๊ณผ "์ธ๊ฐ"๋ ๊ผญ ์์์ผ ํ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ์ด ๋ ๊ฐ์ง๋ ๋ณด์๊ณผ ๊ด๋ จ๋ ํต์ฌ ์์๋ก, ์๋ก ๋ค๋ฅธ ๋ชฉ์ ๊ณผ ์ญํ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๐ ์ธ์ฆ(Authenticati

Spring Boot๋ก ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ํญ์ ์ ๋ขฐํ ์ ์๋ ํํ๋ก ๋ค์ด์ค์ง ์๋๋ค๋ ๊ฑธ ์๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ด ๋ฐ๋ก "Validation"์ ๋๋ค. Spring Boot์์ Validation์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋

์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ๋, JWT(Json Web Token)์ ์ธ์ ์ธ์ฆ์ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ผฝํ๋๋ค. ์ด ๋ ๋ฐฉ์์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํน์ ์ํฉ์์๋ ํ๋๊ฐ ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค. ๋ณธ ๊ธ์์๋ JWT์ ์ธ์ ์ธ์ฆ

์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ์ธ์ฆ ์ ๋ณด๋ ์ฃผ๋ก URL, ํค๋, ๋๋ ๋ฐ๋์ ํฌํจ๋๋๋ฐ, ๊ฐ๊ฐ์ ๋ฐฉ์์๋ ์ฅ๋จ์ ๊ณผ ๋ณด์์์ ๊ณ ๋ ค์ฌํญ์ด ์์ต๋๋ค.URL์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ฐฉ์์ ๊ฐ๋จํ๊ณ ์ง๊ด์

๋ค์ด๊ฐ๋ฉฐ ์คํ๋ง ์ํ๋ฆฌํฐ(Spring Security)๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ํต์ฌ์ ์ธ ์ญํ ์ ๋ด๋นํ๋ฉฐ, ๊ทธ์ค์์๋ โ์ธ๊ฐโ๋ ์ค์ํ ์์ญ์ ๋๋ค. @PreAuthorize์ @Secured๋ ์คํ๋ง ์ํ๋ฆฌํฐ์์ ๋ฉ์๋ ์์ค์์ ๊ถํ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์๋๋ก ์ ๊ณตํ๋ ์

๐ ๋ค์ด๊ฐ๋ฉฐ Spring Security๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ๊ด๋ จ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋๋ Spring ์ํ๊ณ์ ๊ฐ๋ ฅํ ๋ชจ๋์ ๋๋ค. ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์, ์ธ์ ๊ด๋ฆฌ, ๊ถํ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ๋ณด์ ์๊ตฌ์ฌํญ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์์ด ์น ์ ํ๋ฆฌ์ผ์ด์

REST API ๊ฐ๋ฐ ์ ์ํฐํฐ(Entity)๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถํ๋ ๊ฒฝ์ฐ, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์์ ํ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํนํ, ์ํฐํฐ์ ํ๋๋ช ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ฐ์ดํฐ ํ์์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, API๋ฅผ ์ฌ์ฉํ๋ ํ๋ก ํธ์๋ ์ฝ๋๋ ํจ๊ป ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๋น์ฉ๊ณผ

์ค๋์ Spring Boot๋ก ํ์๊ฐ์ ์์คํ ์ ๊ตฌํํด๋ณด๋ ค๊ณ ํฉ๋๋ค.์ค์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด, "์ ์ด๊ฑฐ ๊ทธ๋ฅ Controller์์ ํ๋ฒ์ ๋ค ์ฒ๋ฆฌํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ?"๋ผ๋ ์๊ฐ์ด ๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์๊ฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํด๋ด ์๋ค

์ฝํ๋ฆฐ์์ Entity ํด๋์ค๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ๊น? Data Class์ ํน์ง๊ณผ ์ฅ์ ์ฝํ๋ฆฐ์์๋ data class๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก , , ์ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฐ์ ๋ฌ๋ฆฌ ์ด๋ฅผ ์ง์ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค. 1. ์๋ ์์ฑ๋๋ ์ ์ฉํ ๋ฉ์๋๋ค equ