[JPA] 파일업로드 Presigned URL 리펙토링
기존 방식의 문제점 일반적인 파일 업로드 방식 @PostMapping("/product/new") public String createProduct(MultipartFile image) { // 서버가 파일을 받아서 S3에 업로드 String url = s3Service.upload(image); productService.s...
기존 방식의 문제점 일반적인 파일 업로드 방식 @PostMapping("/product/new") public String createProduct(MultipartFile image) { // 서버가 파일을 받아서 S3에 업로드 String url = s3Service.upload(image); productService.s...
개요 중고거래 플랫폼 프로젝트에서 상품 이미지를 업로드하는 기능을 구현했다. 사용자가 상품 등록 시 메인 이미지 1장과 서브 이미지 최대 4장을 업로드할 수 있도록 했다. 파일 업로드의 흐름 [사용자] → [HTML Form] → [Controller] → [Service] → [AWS S3] | | |...
계기 출퇴근하며 김영한 선생님의 HTTP 강의를 듣던 중, 좋은 URI 설계 개념을 배우게 되었고 개인 프로젝트에도 적용해보고자 리팩토링을 진행했습니다. 기존 코드의 문제점 상품 컨트롤러 @GetMapping("/productMain") public String productMain() { ... } @GetMapping("/product/n...
현재 문제점 상품 등록 페이지 로딩 시 카테고리 트리 로딩 때문에 N+1 문제가 발생했다. 상품 등록 페이지 로딩 시 Category 트리 로딩 때문에 9개의 SQL 발생 재귀 DTO 변환에서 category.getChildren() 접근 → LAZY 로 N+1 현재 로그 2025-10-11 16:06:16.488 [INFO ] [h...
JPQL (Java Persistence Query Language) JPQL란? 테이블이 아닌 객체를 검색하는 객체지향 쿼리 --SQL: 테이블 대상 SELECT * FROM MEMBER WHERE USERNAME = 'kim'; --JPQL: 엔티티 객체 대상 SELECT m FROM Member m WHERE m.username = 'ki...
Proxy 프록시란? 실제 엔티티 대신 사용되는 가짜 객체 // DB를 통해 실제 엔티티 객체 조회 Member member = em.find(Member.class, 1L); // DB조회를 미루는 가짜 프록시 엔티티 객체 조회 Member member = em.getReference(Member.class, 1L); System.out.p...
객체와 테이블의 연관관계 차이 테이블의 연관관계 테이블은 외래키 하나로 양방향 조회가 가능하다. -- MEMBER 테이블 ID (PK) USERNAME TEAM_ID (FK) -- TEAM 테이블 ID (PK) NAME -- 양방향 조회가 모두 가능 -- 멤버 → 팀 조회 SELECT * FROM MEMBER M JOIN TEAM T ON M...
JPA(Java Persistence API) SQL 없이 객체를 데이터베이스에 직접 저장할 수 있게 하고, 객체와 관계형 데이터베이스를 명확히 구분해준다. 즉, 중간에서 매핑 역할을 수행하는 ORM(Object-Relational Mapping) 기술의 표준 인터페이스이다. 객체지향과 관계형 데이터베이스의 패러다임 불일치를 해결해준다. ...
처음에는 단순했다. // 최초저장 if (vo.getFyerSplyBzentyAuditSn() == null || vo.getFyerSplyBzentyAuditSn().isEmpty()) { fyerSplyBzentyChckPlanWrtMDao.saveChkPlan(vo); processAddedSchedules(vo, true); }...
User 엔티티의 문제점 엔티티는 도메인 모델이자 순수한 비즈니스 상태와 행위만 가져야 한다. public static User register(UserDto dto, UserValidator validator, PasswordEncoder passwordEncoder) { validator.RegisterValidate(dto.ge...