๋ชฉ๋ก๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ (454)
Bibi's DevLog ๐ค๐
@Transactional, ํธ๋์ญ์ @Transactional public void create(CardDto cardDto) { Card card = new Card(cardDto); cardRepository.save(card); } @Transactional, ํธ๋์ญ์ ์ฐธ๊ณ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋์ ์์ ์ผ๋ก ๋ฌถ์ด ์ฃผ๋ ๊ฒ. ์์ (1000์ ์ก๊ธํ๊ธฐ) A ๊ณ์ข์์ -1000์, B๊ณ์ข์์ +1000์์ด ๋์ด์ผ ํ๋ค. ์คํ ์ฟผ๋ฆฌ๋ UPDATE๋ฌธ์ผ๋ก ๊ฐ๊ฐ A๊ณ์ข-1000, B๊ณ์ข +1000์์ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ ์ฟผ๋ฆฌ๋ฌธ ์ฌ์ด์์ ์๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด? ์ถ๊ธ(-1000)์ ๋์๋๋ฐ ์ ๊ธ(+1000)์ ๋์ง ์๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ UPDATE ์ฟผ๋ฆฌ๋ฅผ ํ ์์ ์ผ๋ก ๋ฌถ์ด..
@Query public interface CardRepository extends CrudRepository { @Query("select * from card c where not c.status = 'DELETED'") List findByStatusIsNotDeleted(); } @Query() ์ฐธ๊ณ Spring Data JPA์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํด์ผ ํ ๋ ์ฌ์ฉ. ์ธํฐํ์ด์ค์ ์ง์ ๋ฉ์๋๋ฅผ ์ ์ํด ์ฌ์ฉํ๋ค. ์ํ๋ ํ์์ ๋ฉ์๋๋ฅผ ์ ์ (ํ์ํ ํ๋ผ๋ฏธํฐ, ๋ฆฌํดํ์ ์ง์ - ํน์ ํ์ ์ธ ๊ฒฝ์ฐ ๊ทธ ํ์ ์, Collection์ผ ๊ฒฝ์ฐ Set/List/Map์ ์ฌ์ฉ) ๋ฉ์๋์ @Query ์ฌ์ฉ *@Query์ ๋ค์ด๊ฐ ํ ์ด๋ธ, ์์ฑ ๋ช ์ DB ํ ์ด๋ธ์ด ์๋ Entityํด๋์ค ๊ธฐ์ค์ผ๋ก ์์ฑ..
ResponseEntity, @RestController, @RequestBody, @ResponseBody // UPDATE @PutMapping("/cards/{id}") public ResponseEntity editCards(@PathVariable Long id, @RequestBody CardDto newCardDto) { cardService.edit(id, newCardDto); return new ResponseEntity("SUCCESS", HttpStatus.OK); } ResponseEntity HttpEntity : HTTP ์์ฒญ ๋๋ ์๋ต์ ํด๋นํ๋ HTTP Header์ HTTP Body๋ฅผ ํฌํจํ๋ Spring FrameWork์ ํด๋์ค์ด๋ค. ์ด๋ฌํ HttpEntity๋ฅผ ์์๋ฐ..
๊ฐ๋จํ๊ฒ ์์ฝ ์ ๋ฆฌ๋ง ํ๋ค. ์ถ์ฒ 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๊ฐ ์ฌ๋ฌ ๊ฐ์ ์๋ ์..