๋ชฉ๋ก๐ฅ BE ๋ฐฑ์๋/Spring ์คํ๋ง (32)
Bibi's DevLog ๐ค๐
[210626] [JPA] QueryDSL ์ฌ์ฉํ๊ธฐ JPA ์ฌ์ฉ ์, @Query์ JPQL ๋์ ๋ฉ์๋๋ก SQL๋ฌธ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ํ์ธ ๊ฐ๋ฅ build.gradle ์์กด์ฑ ์ถ๊ฐ plugins { id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } ... dependencies { implementation 'com.querydsl:querydsl-jpa' implementation 'com.querydsl:querydsl-apt' // ์๋๋ ์๋ค๋ฉด ์ถ๊ฐ (lombok์ ์ ํ) implementation 'org.springframework.boot:spring-boot-starter-dat..
jasypt (์๋ฐ ํค ์ํธํ ๋ฐฉ์) ์ถ์ฒ : ์ฐ๋๊ฐ ๊ณต์ ํด์ฃผ์ ํ๊ธฐ๋ ธํธ๐โ๏ธ Jasypt Java Simplified Encryption ์๋ฐ ์ฝ๋ ์ํธํ ์๋น์ค ์ ๊ณต DB ํจ์ค์๋, OAuth Client Secret ๋ฑ ๋ฏผ๊ฐ์ ๋ณด๋ฅผ ์ํธํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. Jasypt ์ฌ์ฉํ๊ธฐ 1. ์์กด์ฑ ์ถ๊ฐ build.gradle ์ ์๋ ์ฝ๋ ์ถ๊ฐ compile 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3'2. ๋น๋ฐ๋ฒํธ ์ํธํ https://www.devglan.com/online-tools/jasypt-online-encryption-decryption ์์ ์ํธํํ๊ณ ์ถ์ ์ฝ๋์ ์ํธํ๋ฅผ ์งํ [Jasypt Online Encry..
์ค์ ๋ถ๋ฅ๋๋ก application-๋ถ๋ฅ.properties ํ์ผ์ resourceํจํค์ง์ ์ถ๊ฐํ๊ณ ๊ด๋ จ ์ค์ ์ ํด๋น ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค. ์๋ ์ฝ๋๋ฅผ ์๋ application.propertiesํ์ผ์ ์ถ๊ฐํ๋ค. spring.profiles.include=๋ถ๋ฅ๋ช 1,๋ถ๋ฅ๋ช 2,๋ถ๋ฅ๋ช 3์๋ฅผ ๋ค์ด ๊ธฐ์กด application.properties ์ ํ๊บผ๋ฒ์ ๋ค์ด ์๋ jwt, oauth ์ค์ ๋ค์ ๋ถ๋ฆฌํ๊ณ ์ถ์ ๋ jwt, oauth ์ค์ ๋ค์ ๊ฐ๊ฐ application-jwt.properties, application-oauth.properties ์ผ๋ก ๋ถ๋ฆฌ ๊ธฐ์กด application.properties์ spring.profiles.include=jwt,oauth ์ถ๊ฐ
[Spring] ๊ตฌ๊ธ OAuth ๊ตฌํํ๊ธฐ (+JWT) ์ถ์ฒ https://preamtree.tistory.com/167 https://withseungryu.tistory.com/116 ๊ตฌ๊ธ ๊ณต์๋ฌธ์ - OAuth2.0์ผ๋ก ๊ตฌ๊ธAPI ์ก์ธ์คํ๊ธฐ ํนํ "์๋ฒ์ธก ์น ์ฑ์ฉ OAuth 2.0" ์ฐธ๊ณ ์ ์ฒด flow /login์ผ๋ก ์ ์ ์ ๊ตฌ๊ธ OAuth2.0์ ์ด์ฉํด ์ฌ์ฉ์ ์ ๋ณด(์น์ธ)์ ์์ฒญํจ. ์น์ธ๋๋ฉด ๋ฆฌ๋๋ ์ URI๋ก ์ด๋. ์ด ๋ ๊ตฌ๊ธ๋ก๋ถํฐ code๋ฅผ ๋ฐ๊ธ๋ฐ์. ๊ตฌ๊ธ API ์ฝ์ - API ๋ฐ ์๋น์ค - ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด - ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ - OAuth ํด๋ผ์ด์ธํธ ID - ์ฑ ์ ํ ์ ํ - ์ด๋ฆ ์ค์ - ์น์ธ๋ ๋ฆฌ๋๋ ์ URI ์ง์ . โ ์ด ๋ ๋ฐ๊ธ๋๋ ํด๋ผ์ด์ธํธID(Client Id), ํด๋ผ์ด..
[airbnbํ๋ก์ ํธ] JWT ์ฝ๋ ์ค๋ช ์ถ์ฒ : ์ ์ฒด ์ฝ๋ ์ถ์ฒ๋ https://ocblog.tistory.com/56, ์ค๋ช ์ yeon์ด ํด ์ฃผ์ จ์ต๋๋ค๐โ๏ธ JWT ํ ํฐ ์ ์ฐ๋๊ฐ? ๋ก๊ทธ์ธ ์ ์๋ฒ๊ฐ ํ ํฐ์ ๋ง๋ค์ด ํด๋ผ์ด์ธํธ์ ๋ฐ๊ธํด ์ค๋ค. ์ดํ ๋ก๊ทธ์ธ์ด ํ์ํ URL์์, ํค๋์ ํ ํฐ์ด ๋ค์ด์๋์ง ํ์ธํ๋ค. ํ ํฐ์ด ์์ผ๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํ ๊ธฐ๋ฅ๋ค์ ์ด์ฉํ ์ ์๋ค. ํ ํฐ์ด ์์ผ๋ฉด ๋ก๊ทธ์ธ๋์ง ์์ ์ํ๋ก ๊ฐ์ฃผํ๊ณ ๋ก๊ทธ์ธ์ด ํ์ํ ๊ธฐ๋ฅ๋ค์ ์ด์ฉํ ์ ์๋ค. ์ธํฐ์ ํฐ interceptor ์ธํฐ์ ํฐ : ์ปจํธ๋กค๋ฌ์ ์ค๊ธฐ ์ ์ ์กด์ฌํ๋ ๋จ๊ณ. ํ๋ก ํธ๊ฐ HTTP Header์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ธํ ํ ํฐ์ ๋ด์์ ๋ณด๋ด์ฃผ๋ฉด ("Authorization" : Bearer ํ ํฐ) ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ธํ ํ ํฐ์ด ๋ง๋์ง ํ์ธํ๋ค. ํ ํฐ ..
์คํฌ๋ฆฝํธ์ S3 bucket์ ์ด์ฉํ ์คํ๋ง ์ฑ ๋ฐฐํฌ ์๋ํ(+ ์ฌ๋ ๋ด, crontab ํ์ฉ) yeon์ด ์ค๋ ํ๋ก์ ํธ์์ ๊ฐ๋ฅด์ณ ์ฃผ์ ๋ฐฐํฌ์๋ํ ๊ณผ์ ์ ์ ๋ฆฌํด ๋ณด์๋ค! ๐โ๏ธ (์ถ์ฒ : S3 bucket์ ์ด์ฉํ ๋ฐฐํฌ ์๋ํ) ๋ค์๊ณผ ๊ฐ์ ์๋ํ๋ฅผ ํ๊ฒ ๋๋ค. ๋ก์ปฌ์์ ๋น๋ํ ์คํ๋ง ์ฑ์ ๋น๋ ํ์ผ(jar)์ S3์ ๋ฃ๊ธฐ ์ธ์คํด์ค๊ฐ s3๋ฅผ 1๋ถ๋ง๋ค ์ฒดํฌ ๋น๋ ํ์ผ์ด ์๋ก์ด ๋ฒ์ ์ด๋ฉด s3์์ ๋น๋ ๋ฐ ๋ฐฐํฌ [์ค๋น๋ฌผ] ์ ๋์๊ฐ๋ ์คํ๋ง ์ฑ, aws ๊ณ์ ๊ณผ ec2 ์ธ์คํด์ค, ์ฌ๋ (๋ก์ปฌ) ์คํ๋ง ์ฑ์ ๋น๋ํด jarํ์ผ์ ์์ฑํจ ํ๋ก์ ํธ ํด๋์์ ./gradlew build jar (ec2) S3์์ ๋ฐฐํฌ์ฉ bucket ์์ฑ aws์๋น์ค ์ค s3 ์ ํ - ๋ฒํท - ๋ฒํท ๋ง๋ค๊ธฐ ๋ฒํท ์์ฑ์ ์ด๋ฆ์ด ๋ค๋ฅธ ๋ฒ..
[Spring] ๊ฐ์ URL์ ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ฐ์ ์ ์์ ๋ ๋งตํํ๋ ๋ฒ ๊ฐ์ URL์ ์ฌ์ฉํ๋ฉด์๋, ๋ค๋ฅธ ํ URL์ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๊ฐ์ ๋ฐ์์ค๊ณ ์ถ์ ๋ @GetMapping(params = {"checkIn", "checkOut", "minPrice", "maxPrice", "numberOfPeople"}) ์ ๊ฐ์ด ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋ฐ์์ค๊ณ ์ ํ๋ ๊ฐ์ ํค๋ฅผ ๋์ดํด @GetMapping์ params = {...}์ต์ ์ผ๋ก ์ถ๊ฐํ๋ค. ์๋์ ๊ฐ์ด ๋งตํํ๋ค. @RestController @RequestMapping("/api/rooms") public class RoomController { private RoomRepository roomRepository; private WishRepository w..
[Java] DB์ LocalDate์๋ฃํ ์ ์ฅํ๊ณ ๊บผ๋ด๊ธฐ https://kouzie.github.io/jdbc/JDBC.-2%EC%9D%BC%EC%B0%A8/#javasqlstatement-%EB%A1%9C-select%ED%95%98%EA%B8%B0 DB ํ ์ด๋ธ ๋ ์ง ์๋ฃํ์ธ Date๋ก ์ ์ฅํ๋ค create table `booking` ( `id` int not null auto_increment, `room_id` int not null, `user_id` int not null, `check_in` date not null, `check_out` date not null, `number_of_people` int not null, `total_price` int not null, primary k..