목록웹 개발/Spring Boot (23)
HyeLog

리픽을 개발하면서 카카오톡 알림톡 전송 기능을 구현하려고 했는데, 아직 사업자 등록을 완료하지 않아서 해당 기능은 개발할 수 없게 되었다.. 그래서 문자 전송이라도 해보기로 했다!! 🌈 네이버 SENS (Naver Simple & Easy Notification Service) 네이버 클라우드 플랫폼의 SENS 는 문자 전송 API 를 제공하고 있다. 참고로 2023년 7월말 기준, 이용료(SMS 기준)는 50건까지는 무료이고 그 이후에는 건당 9원이다. 🌈 사전 준비 사항 1. 먼저, 네이버 클라우드 플랫폼에서 회원가입을 진행한 후에 마이페이지 > 계정 관리 > 인증키 관리 로 들어간다. 여기서 신규 API 인증키 생성 을 선택해서 ✨Access Key, Secret Key✨를 발급 받자. (Acces..

이번 프로젝트에서 최신순 / 가격낮은순 / 가격높은순 으로 카테고리의 전체 상품을 보여주는 기능을 구현하게 되었다. 따라서, 페이징 처리를 해야 했는데, 기존에 자주 쓰이던 offset 과 limit 을 사용한 페이징 방식은 속도가 느려서 서비스가 커짐에 따라 장애를 유발할 수 있음을 알게 되었다. 그래서 해당 방식보다 속도가 빠른 No Offset 페이징을 사용하여 페이징 성능을 개선해보고자 한다. 💫 페이징 종류 일반적으로 전체 아이템을 보여주는 방식에는 2가지가 있다. 첫번째는 이렇게 페이지 번호를 명시해서 해당 페이지의 아이템들만 보여주는 방식이다. 두번째는 [상품 더보기]를 누르면 다음 아이템들을 더 보여주는 방식이다. 이번 프로젝트에서는 사용할 방식은 두번째 방식이다. 💫 QueryDSL 로 ..

🌈 개발 환경 이번 프로젝트에서 이미지 파일을 Amazon S3에 업로드(저장) / 조회 / 삭제 하는 기능을 개발하게 되었다. 참고로 프론트엔드에서는 Next.js 를 사용하고, 백엔드에서는 Spring Boot 를 사용하여 개발을 진행하고 있다. 따라서 Spring Boot, Amazon S3 를 사용하여 이미지 파일을 업로드(저장)하고 다시 조회 및 삭제하는 방법에 대해 차근차근 적어보려 한다. 비슷한 환경에서 개발하는 사람들에게 도움이 되었으면 하는 마음이다! 🔥 전체적인 Flow 1. 프론트엔드에서 이미지 파일을 Form data 로 포장하여 백엔드에게 전달 2. 백엔드에서 해당 이미지를 Amazon S3 에 업로드, 업로드된 이미지 정보를 DB에 저장 3. 프론트엔드에서 이미지 조회시, 백엔드..
N+1 문제 N+1 문제란, 연관관계가 설정된 엔티티를 조회하는 1개의 쿼리에 대해 조회된 엔티티 개수(N개)만큼 그와 연관된 엔티티를 조회하는 N개의 쿼리가 추가로 발생하는 문제를 말한다. 예를 들어, 고객(Customer)과 주문(Order)이 1:N 연관관계를 맺고 있을 때 아래와 같이 주문(Order)을 조회하면, List orders = orderRepository.findAll(); 실제로 이런 쿼리가 수행되고, SELECT * FROM `Orders` orderentit0_; 위 쿼리의 결과로 N개의 레코드가 반환되었을 때 추가로 아래와 같은 쿼리가 N개 발생한다. SELECT * FROM `Customers` customeren0_ WHERE customeren0_.`customer_id`..
컬렉션 파라미터 바인딩도 실무에서 많이 사용된다. 예시: @Query("select m from Member m where m.username in :names") List findByNames(@Param("names") List names); 이렇게 IN 절을 사용할 수 있다.
@Query 개발하다보면 JPA의 Query Methods만으로는 조회가 불가능한 경우가 있을 것이다. 또한 메소드 이름으로 쿼리 생성 기능(Query Method)을 사용하다보면 메소드 이름이 지저분해지는 단점이 있다. 이럴 때 사용하는 것이 @Query 이다. @Query 는 Repository에 바로 작성한다. Repository 에 메소드를 정의하고, @Query 어노테이션 안에 쿼리를 작성하는 방식이다. 예시: public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username= :username and m.age = :age") List findUser(@Param("use..

🌠 값 타입 JPA의 데이터 타입 분류 엔티티 타입 (@Entity로 정의하는 객체 → 데이터가 변해도 식별자로 지속해서 추적 가능) 값 타입 값 타입 분류 기본값 타입 (Ex. int, double, Integer, Long, String, ···) 임베디드 타입 (복합 값 타입 → 직접 정의 가능) 컬렉션 값 타입 (Ex. Set, List, ···) 🌠 임베디드 타입 임베디드 타입은 새로운 값 타입을 직접 정의할 수 있다. 주로 기본 값 타입을 모아서 만들기 때문에 '복합 값 타입'이라고도 한다. 임베디드 타입은 int, String과 같은 '값 타입'으로써 엔티티가 아니고, 한번 값을 변경하면 추적이 불가능하다. 임베디드 타입은 언제 사용할까? DB의 회원 테이블에 근무 시작일, 근무 종료일, 주..
👩👧👦 영속성 전이(CASCADE) 개념 부모 : 자식 = 1 : N 관계이고, 양방향 매핑을 사용할 때 코드를 살펴보자. - 부모(Parent) @Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "parent") private List childList = new ArrayList(); public void addChild(Child child) { // 연관관계 편의 메소드 this.childList.add(child); child.setParent(this); } // 기본생성자, get..