JWT - Header, Payload, Signature 3๊ฐ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ Header : Signature๋ฅผ ํด์ฑํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๋ค ๋ด๊ฒจ์์ Payload : ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋, ์์คํ ์์ ์ค์ ๋ก ์ฌ์ฉ๋ ์ ๋ณด๋ค์ ๋ํ ๋ด์ฉ ๋ด๊ณ ์์ Signature : ํ ํฐ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ํ ๋ฌธ์์ด (์ ํจํ ํ ํฐ์ธ์ง ๊ฒ์ฆ)
- ์ํฐํฐ๋ฅผ ์ง์ ๋ ธ์ถํ์ง ๋ง๊ณ DTO ๋ณํํด๋ผ - ์ง์ฐ ๋ก๋ฉ(LAZY)๋ฅผ ํผํ๊ธฐ ์ํด ์ฆ์ ๋ก๋ฉ(EARGER)๋ก ์ค์ ํ๋ฉด ์๋๋ค. ์ฆ์ ๋ก๋ฉ ๋๋ฌธ์ ์ฐ๊ด๊ด๊ณ๊ฐ ํ์์๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ํญ์ ์กฐํํด์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ํญ์ ์ง์ฐ๋ก๋ฉ์ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ , ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํ์น์กฐ์ธ์ ์ฌ์ฉํด๋ผ! (+์ง์ฐ๋ก๋ฉ์ ๊ฒฝ์ฐ ์ฐ๊ด๋ ์ํฐํฐ๋ ํ๋ก์๋ก ์ค์ ๋์ด์๊ณ getName()๊ณผ ๊ฐ์ด ์ง์ ํธ์ถํด์ผ LAZY๊ฐ ๊ฐ์ ์ด๊ธฐํ๋จ) Controller API ์์ @GetMapping("/api/v3/orders") public List ordersV3() { List orders = orderRepository.findAllWithItem(); List result = orders.strea..
1. JPQL - ๋ฐ์ดํฐ ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ - ๊ฐ์ฒด ์งํฅ SLQ ( ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กด x) 2. Criteria - ๋ฌธ์๊ฐ ์๋ ์๋ฐ์ฝ๋๋ก JPQL์ ์์ฑํ ์ ์์ - ๋๋ฌด ๋ณต์กํ๊ณ ์ค์ฉ์ฑ x 3. QueryDSL - ์๋ฐ์ฝ๋๋ก JPQL ์์ฑ ๊ฐ๋ฅ - ๋์ ์ฟผ๋ฆฌ ์์ฑ ํธ๋ฆฌ - ๋จ์ํ๊ณ ์ฌ์ - ์ค๋ฌด ์ฌ์ฉ ๊ถ์ฅ 4. ๋ค์ดํฐ๋ธ SQL 5. JDBC API ์ง์ ์ฌ์ฉ, MyBatis, SpringJdbcTemplate ํจ๊ป ์ฌ์ฉ!!
ํน์ ํ ์ด๋ธ์์ ๋ฆฌ์คํธ ํ์์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ RDBMS๋ ํ ์ด๋ธ ์์ ๋ฆฌ์คํธ๋ก ์ ์ฅ์ด ๋ถ๊ฐ. ์ฆ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ๋นผ๋ด์ผ ํจ (๋นผ๋ธ ํ ์ด๋ธ์ Id์ ์ปฌ๋ผ ์ ๋ถ๋ฅผ pk๋ก ๊ฐ์ง๋ค.) Ex) //์ฃผ์ @Embedded private Address homeAddress; //HashSet @ElementCollection @CollectionTable(name = "favorite_food", joinColumns = @JoinColumn(name = "member_id")) // FK๋ก ์ก๊ธฐ ์ํจ private Set favoriteFoods = new HashSet(); //ArrayList @ElementCollection @CollectionTable(name = "address", joinC..
Ex) Member ์ํฐํฐ //๊ธฐ๊ฐ Period @Embedded private Period workPeriod; //์ฃผ์ @Embedded private Address homeAddress; Ex) Period @Embeddable public class Period { private LocalDateTime startDate; private LocalDateTime endDate; ์์ฑ์ Getter, Setter . . } - ํด๋์คํํ๋ ๊ธฐ์กด๊ณผ ๊ฐ๊ฒ ํ๋ฉฐ ์์ ๊ฐ์ด ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ - ์๋ฒ ๋๋ ํ์ ์ ์ฌ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ๋งคํํ๋ ํ ์ด๋ธ์ ๊ฐ๋ค. @AttributeOverrides(์์ฑํ๋), @AttributeOverride(์์ฑ ์ฌ๋ฌ๊ฐ) Ex) ์๋ฒ ๋๋ ํ์ Address ์ ๋ํ์ฌ..
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) //childList๊น์ง ํจ๊ป persit ๋ ๋ ค์ฃผ๊ฒ ๋ค๋ ์๊ธฐ private List childList = new ArrayList(); ์์ ๊ฐ์ด ํน์ ํ๋์ cascade ์ค์ ์ ํ ๊ฒฝ์ฐ parent๋ฅผ persistํ ๋ childList๋ ํจ๊ป persist ๋๋ค. Ex) Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); ์์ ๊ฐ์ด parent๋ง persist ํด์ฃผ์ด๋ ๊ทธ ..
- ์ค์ ์ํฐํฐ๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ง(๋ฐ๋ผ์ ๊ฒ๋ชจ์์ด ๊ฐ๋ค) - ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ฐธ์กฐ(target)์ ๋ณด๊ด - ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ ** ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ์ํฐํฐ๋ฅผ ์์๋ฐ์ . ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋, ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ค์ ์ํฐํฐ๋ก ๋ฐ๋๋ ๊ฒ์ ์๋. ์ด๊ธฐํ๋๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ์ ์ ๊ทผ ๊ฐ๋ฅ ์์์ฑ ์ปจํ ์คํธ์ ์ฐพ๋ ์ํฐํฐ๊ฐ ์ด๋ฏธ ์์ผ๋ฉด em.getReference() ํธ์ถํด๋ ์ค์ ์ํฐํฐ ๋ฐํ Member findMember = em.getReference(Member.class, member); //๋น ๊ป๋ฐ๊ธฐ(ํ๋ก์) //getUsername()์์ ์ค์ ์ฟผ๋ฆฌ ์คํ -> ํ๋ก์ ์ด๊ธฐํ System.out.println("findMem..
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์๊ด๊ณ๊ฐ ์กด์ฌํ์ง ์์ 1. ์กฐ์ธ ์ ๋ต (์ต์ฐ์ ์ ํ, ๋ณต์กํ๊ฒฝ์ฐ) insert๋ ๋ถ๋ชจ์ ์์์ 2๋ฒ / DTYPE์ผ๋ก ์กฐ์ธํ ์์ ์ํฐํฐ ๊ตฌ๋ถ @Inheritance(strategy = InheritanceType.JOINED) 2. ๋จ์ผ ํ ์ด๋ธ ์ ๋ต(๋จ์ํ ๊ฒฝ์ฐ) ํ ํ ์ด๋ธ์ ํฉ์น๋ค(JPA์ ๊ธฐ๋ณธ์ ๋ต์) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ๋ถ๋ชจ ์ํฐํฐ์ ์ ์ฉ @DiscriminatorColumn //DTYPE ์์์ํฐํฐ ์ ์ฉ @DiscriminatorValue("A")//์์ ์ํฐํฐ ๊ตฌ๋ถ์ @MappedSuperclass - ์์๊ด๊ณ ๋งคํ์ ์๋์ง๋ง ๊ณตํต๋๋ ์์ฑ์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ!! - ์ํฐํฐ๋ ์๋(ํ ์ด๋ธ..
- null ์ด๋ฉด ์๋๋ค. - ์ ์ผํด์ผ ํ๋ค. - ์์ฐํค๋ ์ฐพ๊ธฐ ์ด๋ ค์ ๋์ฒดํค๋ฅผ ์ฌ์ฉํ์! - ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๋ ๊ธฐ๋ณธ ํค๋ก ์ ์ ํ์ง ์๋ค. (์ ๋งํ๋ฉด ์๋ฏธ ์๋ ๊ฐ์ pk๋ก ์ ํํ์ ex) 1,2,3,4,..) - Auto Increment(IDENTITY) ์๋๋ฉด Sequence object ๋์ค์ ํ๋ ์ฐ๊ธฐ +) GeneratedValue ๊ฐ IDENTITY์ธ ๊ฒฝ์ฐ ์์ธ์ ์ผ๋ก persist ์์ ๋๋น์ ๋ฐ๋ก Insert query๊ฐ ๋ ๋ผ๊ฐ๋ค. (๋๋น๊ฐ ์๋์ผ๋ก ์์ฑํ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ฅํด์ผํ๋ฏ๋ก) sequence๋ ์ปค๋ฐ์์ query +) ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ณด๋ค๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ฅผ ํ์! (JPA์์๋ ์ํฐํฐ๊ฐ์ ์ฐ๊ด๊ด๊ณ๊ฐ ์์ ๊ฒฝ์ฐ id ๊ฐ์ ์ฐธ์กฐํ์ง๋ง๊ณ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ฐธ์กฐ!)
JPA์์ ๊ฐ์ฅ ์ค์ํ 2๊ฐ์ง - ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งคํํ๊ธฐ - ์์์ฑ ์ปจํ ์คํธ(์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ) ์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผ ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ - ๋น์์ : ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ - ์์ : ๊ฐ์ฒด๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํ ์ํ (EX) persist() / But, ์ปค๋ฐ๊น์ง ํด์ผ ๋๋น์ ์ฟผ๋ฆฌ ๋ ๋ผ๊ฐ) - ์ค์์ : ์์ ์ํ์ ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ(detach(entity), clear(), close()) - ์ญ์ ์์์ฑ ์ปจํ ์คํธ์ ์ด์ • 1์ฐจ ์บ์ • ๋์ผ์ฑ(identity) ๋ณด์ฅ (๊ฐ์ ํธ๋์ญ์ ์์ ๋น๊ต์์) • ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (transactional write-behind) • ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking) • ์ง์ฐ ๋ก..
๊ด๊ณํ DB๊ฐ ์๋ฌด๋๋ NoSQL๋ณด๋ค๋ ๋ฉ์ธ! JPA-> ORM ํ๋ ์์ํฌ๊ฐ ์ค๊ฐ์์ ๋งคํ(๊ฐ์ฒด์งํฅ๊ณผ ๊ด๊ณํ DB์ฌ์ด) -> SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ -> ์์ฐ์ฑ (CRUD ๊ฐ๋จ) - ์ ์ฅ(persist) ์กฐํ(find) ์์ (set) ์ญ์ (remove) - DB์ ๋ค์ ์ง์ด๋ฃ๋ ์์ ์ ํ์ง ์์๋ ๋จ -> ์ ์ง๋ณด์ -> ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ -> ์ฑ๋ฅ -> ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋ ๋ฆฝ์ฑ -> ํ์ค
๋ณ๊ฒฝ๋ฐฉ๋ฒ 1. ๋ณํฉ(merge) -> ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์์ ์ํ์ ์ํฐํฐ ํ๋๊ฐ์ผ๋ก ๋ชจ๋ ํ๋๋ฅผ ๋ณ๊ฒฝ -> ์ธํ ํด์ฃผ์ง ์์ ํ๋๊ฐ์ null๋ก ๋ณ๊ฒฝ๋๋ฏ๋ก ๊ต์ฅํ ์ํ 2. ๋ณ๊ฒฝ๊ฐ์ง -> ํจ์ฌ ๋์ ๋ฐฉ๋ฒ -> ๊ฐ์งํ DB์์ ์์์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ํด์ค / ์ํ๋ ์์ฑ๋ง ์ ํํด์ ๋ณ๊ฒฝ ๊ฐ๋ฅ -> ์ปจํธ๋กค๋ฌ์์ ํธ์ถํ ์๋น์ค ์์ญ ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ํจ์๋ฅผ ๋ง๋ ๋ค. +) ์ํฐํฐ ์์ญ์์์ ์ ๋ฐ์ดํธํจ์ ๋ง๋ค๊ณ ์๋น์ค์์ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ํด๋น ํจ์ ๋ถ๋ฅด๋ ๊ฒ์ด ๋ซ๋ค. (์ ์ง๋ณด์,์ถ์ ์ํด) ์ํฐํฐ ํด๋์ค๋ด์์ ๊ฐ์ฒด ์์ฑ, ๋ณ๊ฒฝ, ์กฐํ๋ฑ์ ๋น์ฆ๋์ค ๋ก์ง ์์ฑํ๋ค. -> ์๋น์ค์์ ํธ์ถ -> ์ปจํธ๋กค๋ฌ๊ฐ ์๋น์ค ํธ์ถ