μŠ€ν”„λ§/μ‡Όν•‘λͺ° ν”„λ‘œμ νŠΈ

μƒν’ˆ 등둝 ν›„, insert into item 쿼리문이 싀행됨 μ—¬κΈ°μ„œ item_idλŠ” 1! 이 μƒν’ˆ μ•„μ΄λ””λ‘œ μˆ˜μ • νŽ˜μ΄μ§€μ— μ§„μž… μƒν’ˆ 쑰회 μƒν’ˆμ„ μˆ˜μ •ν•˜λ €λ©΄ ν•΄λ‹Ή μƒν’ˆμ„ λΆˆλŸ¬μ™€μ•Ό 함 λ”°λΌμ„œ, ItemService에 μƒν’ˆ 쑰회 λ©”μ„œλ“œ μΆ”κ°€ (쑰회 κΈ°λŠ₯이라 읽기 μ „μš©) item 엔티티와 image 정보 μ—”ν‹°ν‹°λ₯Ό itemFormDto 객체둜 λ³€ν™˜ ν›„ λ°˜ν™˜ν•˜λŠ” 쑰회 κΈ°λŠ₯ @Transactional(readOnly = true) public ItemFormDto getItemDtl(Long itemId) { List itemImageList = itemImageRepository.findByItemIdOrderByIdAsc(itemId); List itemImageDtos = new ArrayList(); for..
Auditing μ—”ν‹°ν‹°μ˜ 곡톡 멀버 λ³€μˆ˜λ“€μ„ 좔상 클래슀둜 λ§Œλ“€κ³ , ν•΄λ‹Ή 좔상 클래슀λ₯Ό 상속받아 엔티티에 곡톡적인 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ„λ‘ ν•˜λ©° μ—”ν‹°ν‹°μ˜ 생성과 μˆ˜μ •μ„ κ°μ‹œν•˜λŠ” 기법 AuditorAware μΈν„°νŽ˜μ΄μŠ€ ν˜„μž¬ λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 정보λ₯Ό λ“±λ‘μžμ™€ μˆ˜μ •μžλ‘œ μ§€μ •ν•˜κΈ° μœ„ν•΄μ„œ AuditorAware μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 생성 public class AuditorAwareImpl implements AuditorAware { @Override public Optional getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String userId = ""; if..
μ¦‰μ‹œ λ‘œλ”© β†’ μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ μ—°κ΄€λœ μ—”ν‹°ν‹°λ₯Ό ν•¨κ»˜ 쑰회 μ¦‰μ‹œ λ‘œλ”© ν…ŒμŠ€νŠΈ @SpringBootTest @TestPropertySource(locations = "classpath:application-test.properties") @Transactional class OrderTest { /* μ½”λ“œ μƒλž΅ */ @Autowired OrderItemRepository orderItemRepository; @Test void μ¦‰μ‹œ_λ‘œλ”©_ν…ŒμŠ€νŠΈ() { Order order = this.createOrder(); Long orderItemId = order.getOrderItems().get(0).getId(); entityManager.flush(); entityManager.clear(); OrderI..
μ˜μ†μ„± μ΄λž€? (JPA Persistence) JPA μ—μ„œμ˜ μ˜μ†μ„±μ€ Entityλ₯Ό 영ꡬ적으둜 μ €μž₯ν•΄μ£ΌλŠ” ν™˜κ²½μ„ 의미 μ˜μ†μ„± 전이(cascade) λž€? 사전적 μ •μ˜ : 'μž‘μ€ 폭포', '폭포처럼 흐λ₯Έλ‹€' λΌλŠ” 뜻 μ—”ν…Œν‹° μƒνƒœλ₯Ό λ³€κ²½ν•  λ•Œ, ν•΄λ‹Ή 엔티티와 μ—°κ΄€λœ μ—”ν‹°ν‹°μ˜ μƒνƒœ λ³€ν™”λ₯Ό μ „νŒŒμ‹œν‚€λŠ” μ˜΅μ…˜ μ΄λ•Œ, λΆ€λͺ¨λŠ” One에 ν•΄λ‹Ήν•˜κ³  μžμ‹μ€ Many에 ν•΄λ‹Ή EX ) Order μ—”ν‹°ν‹°κ°€ μ‚­μ œλ˜μ—ˆμ„ λ•Œ ν•΄λ‹Ή 엔티티와 μ—°κ΄€λ˜μ–΄ μžˆλŠ” OrderItem μ—”ν‹°ν‹°κ°€ ν•¨κ»˜ μ‚­μ œ λ˜κ±°λ‚˜, Order μ—”ν‹°ν‹°λ₯Ό μ €μž₯ ν•  λ•Œ Order 엔티티에 λ‹΄κ²¨μžˆλ˜ OrderItem μ—”ν‹°ν‹°λ₯Ό ν•œκΊΌλ²ˆμ— μ €μž₯ κ°€λŠ₯ πŸ™‹β€β™€οΈ μƒνƒœκ°€ μ „νŒŒλ˜λŠ” λͺ¨μŠ΅μ„ 폭포가 흐λ₯΄λŠ” λͺ¨μŠ΅μœΌλ‘œ 상상 CASCADE μ’…λ₯˜ μ„€λͺ… PERSIST λΆ€λͺ¨ μ—”ν‹°ν‹°κ°€ μ˜μ†ν™”λ  λ•Œ, μžμ‹..
μ—°κ΄€ 관계 맀핑 μ’…λ₯˜ μΌλŒ€μΌ(1:1) β†’ @OneToOne μΌλŒ€λ‹€(1:N) β†’ @OneToMany λ‹€λŒ€μΌ(N:1) β†’ @ManyToOne λ‹€λŒ€λ‹€(N:N) β†’ @ManyToMany μ—°κ΄€ 관계 맀핑 λ°©ν–₯ DB 쀑심 섀계 ν…Œμ΄λΈ”μ—μ„œ κ΄€κ³„λŠ” 항상 μ–‘λ°©ν–₯ JPA 객체 지ν–₯ 쀑심 μ„€κ³„μ—μ„œλŠ” 단방ν–₯, μ–‘λ°©ν–₯ 쑴재 μΌλŒ€μΌ 단방ν–₯ λ§€ν•‘ν•˜κΈ° Cart β†’ Member μž₯λ°”κ΅¬λ‹ˆ-νšŒμ› 맀핑 ν…ŒμŠ€νŠΈ @Autowired CartRepository cartRepository; @Autowired MemberRepository memberRepository; @Autowired MemberController memberController; @PersistenceContext EntityManager entityManager; priv..
ADMIN κ³„μ •λ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„€μ • πŸ™ μƒν’ˆ 등둝, μˆ˜μ •, μ‚­μ œ νŽ˜μ΄μ§€ λ“±λ“± CustomAuththenticationEntryPoint public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"..
μƒν’ˆ μ—”ν‹°ν‹° @Entity @Getter@Setter public class Item { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "item_id") private Long id; private String itemName; private int price; private String itemDetail; private String type; @Enumerated(EnumType.STRING) private ItemSellStatus itemSellStatus; }ItemSellStatus ν’ˆμ ˆ/판맀 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” Enum Class μƒν’ˆ 이미지 application.properties μ„€μ • # 파일 ν•œ κ°œλ‹Ή μ΅œλŒ€ μ‚¬μ΄μ¦ˆ s..
νšŒμ› κ°€μž… ν™”λ©΄μœΌλ‘œ λΆ€ν„° λ„˜μ–΄μ˜€λŠ” κ°€μž…μ •λ³΄λ₯Ό 담을 DTO 객체 @Setter @NoArgsConstructor public class MemberFormDto { @NotBlank(message = "이름은 ν•„μˆ˜ μž…λ ₯ κ°’μž…λ‹ˆλ‹€.") private String name; @NotEmpty(message = "μ•„μ΄λ””λŠ” ν•„μˆ˜ μž…λ ₯ κ°’μž…λ‹ˆλ‹€.") private String memberId; @NotEmpty(message = "λΉ„λ°€λ²ˆν˜ΈλŠ” ν•„μˆ˜ μž…λ ₯ κ°’μž…λ‹ˆλ‹€.") @Length(min = 8, max = 16, message = "λΉ„λ°€λ²ˆν˜ΈλŠ” 8자 이상, 16자 μ΄ν•˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”.") private String password; @NotEmpty(message = "μ£Όμ†ŒλŠ” ν•„μˆ˜ μž…λ ₯ κ°’μž…λ‹ˆλ‹€.") private ..
KIMHYEYUN
'μŠ€ν”„λ§/μ‡Όν•‘λͺ° ν”„λ‘œμ νŠΈ' μΉ΄ν…Œκ³ λ¦¬μ˜ κΈ€ λͺ©λ‘