๋ชฉ๋ก๐ฅ BE ๋ฐฑ์๋ (118)
Bibi's DevLog ๐ค๐
๊ฐ๋จํ๊ฒ ์์ฝ ์ ๋ฆฌ๋ง ํ๋ค. ์ถ์ฒ https://ryan-han.com/post/translated/pathvariable_queryparam/ https://elfinlas.github.io/2018/02/18/spring-parameter/ https://willbesoon.tistory.com/102 ์ฌ์ฉ๋ฐฐ๊ฒฝ http์์๋ ์์ฒญ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฅํด ์ฃผ์ง ์๋๋ค. ์ฐ๊ฒฐ ํด ๋๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์์ด ์๋๋ผ, ํ์ํ ๋๋ง๋ค ์ฐ๊ฒฐํ๋ค. ๊ณตํต์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ์ฌ์ฉ๋๋ค. URL์ ํตํด ๊ฐ์ ์ ๋ฌํ๋ค. Query Parameter ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ (์คํ๋ง์ @RequestParam) /users?id=123 ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ๊ณผ ๊ฐ์ ํจ๊ป ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค Best Practice : ์ ๋ ฌ / ํํฐ๋ง์ ํ ..
Key ์ํผํค super key : ํด๋น ๊ฐ์ฒด๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ attribute์ ''์งํฉ''. [์ฃผ๋ฏผ๋ฒํธ ์์๋ฆฌ, ์ฃผ๋ฏผ๋ฒํธ ๋ท์๋ฆฌ, ์ด๋ฆ] ํ๋ณดํค candidate key : ์ํผํค์ ๋ถ๋ถ์งํฉ. ์ํผํค์์ ๊ตฐ๋๋๊ธฐ๋ฅผ ์ ๊ฑฐํ ๊ฒ. (์ํ์ ์ ์) ''๋ชจ๋ ๋ค๋ฅธ attribute๋ค์ ํจ์์ ์ผ๋ก ๊ฒฐ์ ํ๋ attribute'' ์ํผํค์ ๊ตฌ์ฑ attribute ์ค ํ๋๋ผ๋ ์ ๊ฑฐํ๋ฉด ์ํผํค๊ฐ ์๋ ๊ฒ. ํ๋ณดํค ์ค์ ํ๋๊ฐ PK๊ฐ ๋ ์ ์๋ค. [์ฃผ๋ฏผ๋ฒํธ ์์๋ฆฌ, ์ฃผ๋ฏผ๋ฒํธ ๋ท์๋ฆฌ, ์ด๋ฆ]์์ [์ฃผ๋ฏผ๋ฒํธ ์์๋ฆฌ, ์ฃผ๋ฏผ๋ฒํธ ๋ท์๋ฆฌ]๊ฐ ํ๋ณดํค์ ํด๋นํ๋ค. ๊ธฐ๋ณธํค primary key : ์ฌ๋ฌ ํ๋ณดํค ์ค ๋ํ์ ์ธ ํค ํ๋๋ฅผ ์ ํํด ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ก ๋ง๋ ..
Spring Data JDBC ๊ณต์ ๋ฌธ์ 1, 2๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค ์๊ฐ Spring Data family ๊ตฌ์ฑ์ JDBC ๊ธฐ๋ฐ์ผ๋ก repository๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ค๋ค DDD(Domain Driven Design)์์ ์๊ฐ์ ๋ฐ์ JPA๋ณด๋ค ๊ธฐ๋ฅ์ ์ ์ง๋ง ๋ ๋จ์ํจ. ๊ฐ๋จํ๋ฉด์ ์ ํ๋ ๋ฐฉ๋ฒ๋ค์ ์ง์ํจ ์ง์ ๊ธฐ๋ฅ CrudRepository @Query Id ์์ฑ ์ด๋ฒคํธ ์ฒ๋ฆฌ MyBatis, Auditing, CustomConversions ์ง์๋์ง ์๋ ๊ธฐ๋ฅ ์บ์ฑ, ์ง์ฐ ๋ก๋ฉ JPA์ ๋ฌ๋ฆฌ save()ํ๋ฉด ์ ์ฅ๋๊ณ , save()ํ์ง ์์ผ๋ฉด ์ ์ฅ๋์ง ์๋๋ค. DDD (๋๋ฉ์ธ ๊ธฐ๋ฐ ์ค๊ณ) ๋ชจ๋ spring data ๋ชจ๋์ DDD์ repository, aggregate, aggregate roo..
๋งต์ผ๋ก 1:N ๊ด๊ณ ๋งตํ @MappedCollection() : ๋งต์ ํค์ ๊ธฐ์กด ํค๋ฅผ ๋งตํํ๊ธฐ. idColumn="" : id๋ก ์ธ ํ ์ด๋ธ์ปฌ๋ผ๋ช ์ง์ . (์ธ๋ ํค๋ก ์ฐ๊ฒฐํด ์ค) Dish์ ์นดํ ๊ณ ๋ฆฌ keyColumn="" : ๋งต์ key๊ฐ์ผ๋ก ์ธ ํ ์ด๋ธ์ปฌ๋ผ๋ช ์ง์ ์ด๋ฒ ๋ฏธ์ ์ ๊ฒฝ์ฐ.. Category : Dish ๊ฐ 1:N ๊ด๊ณ์ด๋ฏ๋ก 1์ธ Category๊ฐ N์ธ Dish๋ค์ Map(dishes)์ ๊ฐ์ ธ์ผ ํ๋ค. dishes๊ฐ ๊ฐ๋ ID Category.java public class Category { @Id private Long id; private String name; private CategoryType type; @MappedCollection(idColumn = "category", keyCo..
[DB] 1:1, 1:N, N:M ๊ด๊ณ ์ด ๊ธ์ ๋ณด๊ณ ์์ฝ ์ ๋ฆฌํจ. ์๋ณธ์ด ํจ์ฌ ๋ซ์ต๋๋ค. ๋ด๊ฐ 1:N๊ด๊ณ๋ฅผ ์ ์ดํดํ์ง ๋ชปํ๊ณ ์๋ ๊ฒ ๊ฐ์์ ์ข ์ฐพ์๋ณด์๋คใ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ '๊ด๊ณ' ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ํฐํฐ๋ผ๋ฆฌ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ด๊ณํ์ด๋ผ๋ ๋ง์ด ๋ถ์ ๊ฒ์ด๋ค. ์ํฐํฐ Entity : DB์ ํํํ๋ ค๊ณ ํ๋ ์ ํ/๋ฌดํ์ ๊ฐ์ฒด๋ก์ ์๋ก ๊ตฌ๋ณ๋๋ ๊ฒ. ๊ด๊ณ Relationship : ๋ ์ํฐํฐ๊ฐ ์๋ก ๊ด๋ จ์ด ์์ ๋. 1:1, 1:N, N:M ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๋ค. 1:1 ๊ด๊ณ ์ํฐํฐ A๊ฐ ์๋ ์ํฐํฐ B์ ๋จ ํ๋์ ๊ด๊ณ๋ง ๊ฐ๋ ๊ฒ. (์ํฐํฐB๋ ์ํฐํฐA์ ๋จ ํ๋์ ๊ด๊ณ๋ง ๊ฐ๋๋ค) ex) ์ฐ๋ฆฌ๋๋ผ์์์ ๊ฒฐํผ ์ ๋(์ผ๋ถ์ผ์ฒ์ ) 1:N ๊ด๊ณ ์ํฐํฐ A๊ฐ ์ฌ๋ฌ ๊ฐ์ ์๋ ์..
AWS Ubuntu์ ์คํ๋ง ์ฑ ๋ฐฐํฌ ๊ณผ์ ๋ค์ ์ ๋ฆฌ .. AWS ์ธ์คํด์ค(์ฐ๋ถํฌ)๋ ์์ฑ ๋ฐ ์คํ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. AWS EC2 ์ฐ๋ถํฌ์ mysql ์ค์น MySQL ์ค์น sudo apt update sudo apt-get install mysql-server MySQL ์ ์ mysql -u root -p (์ ์ ๋๋ฉด sudo mysql -u root -p) (ํจ์ค์๋๋ ์ค์ ํ ๊ฐ ์ ๋ ฅ, ์์ผ๋ฉด ๊ทธ๋ฅ ์ํฐ) ์์ฑํ ์ ์ ๋ก ์ ์ํ๋ ค๋ฉด mysql -u ์ ์ ์ด๋ฆ -p MySQL ์ฌ์ฉ์ ์์ฑ create user '์ฌ์ฉ์์ด๋ฆ'@'ip์ฃผ์' identified by '๋น๋ฐ๋ฒํธ'; flush privileges; ๋ชจ๋ ip์์ ์ ์์ ํ์ฉํ๊ณ ์ถ๋ค๋ฉด create ..
Http Response Body์ Exception error message ์ง์ ํ๊ธฐ ์ง์ ๋ง๋ ์๋ฌ๋ฉ์์ง๋ฅผ Http Response์ "message" :์ ๋ฃ์ด ์ค ์ ์๋ค. ๋จผ์ Exception๊ณผ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ง๋ ๋ค. DishController.java // ... @PutMapping("/{dishId}") public ResponseEntity orderDish(@PathVariable String dishId, @RequestParam("count") int orderSize) { if (dishService.orderDish(dishId, orderSize)) { return ResponseEntity.ok().body(new ResponseDto(Status.OK)); } return ..
@Embeded ์ฐ๊ด ์๋ ์ปฌ๋ผ๋ค์ ๋ฌถ๋ ํ ์ด๋ธ์ ์๋ก ๋ง๋ค์ง ์๊ณ , @Embeded๋ฅผ ์ฌ์ฉํด ๋ง์น ํ๋์ ํ ์ด๋ธ์ ๋ง๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค!! [JPA] @Embeded, ์๋ฒ ๋๋ ํ์ https://velog.io/@conatuseus/JPA-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-%ED%83%80%EC%9E%85embedded-type-8ak3ygq8wo ์ ์ ์ค๋ช ๋์ด ์์ด ์์ฝ ์ ๋ฆฌ๋ง ํ์ต๋๋ค.๐โ๏ธ JPA์์ ์๋ฒ ๋๋ ํ์ (๋ณตํฉ ๊ฐ ํ์ )์ด๋ ์๋ก์ด ๊ฐ ํ์ ์ ์ง์ ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์๋ฒ ๋๋ ํ์ ์ญ์ int, String์ฒ๋ผ ๊ฐ ํ์ ์ด๋ค. โ ์๋ฒ ๋๋ ํ์ ์ ์ฐ๋ ์ด์ โ ์์ธํ ๋ฐ์ดํฐ๋ค์ ๊ด๋ จ ์๋ ํ์ ์ผ๋ก ๋ฌถ์ด ๊ฐ์ฒด์งํฅ์ ์ด๊ณ ์์ง๋ ฅ ๋๊ฒ ๋ง๋ค๊ธฐ ์..