Backend/SpringBoot 60

실행시 DB에 데이터 넣기

서버 실행시 DB 테이블에 미리 데이터를 넣을 필요가 있을경우 사용(기본 or 필수 데이터) 3가지 방법이 있다.  데이터 넣기 (data.sql)resources -> data.sql 생성 -> 쿼리문 작성yml 파일 수정defer-datasource-initialization : 'true' 설정sql init mode always 설정...spring: jpa: ... defer-datasource-initialization: 'true' sql: init: continue-on-error: 'true' mode: always...데이터 넣기 (@Transactional, @EventListener 어노테이션 이용)@Component 를 이용해 클래..

Backend/SpringBoot 2024.11.19

AOP (함수 실행 intercept)

함수들이 실행 될 때마다 중간에 intercept 하여 여러가지 작업을 할 수 있다. 예를들어 실행 시간 측정이나, 인자값 검사, 로깅 작성등이 가능하다. 쉽게 생각하면 클라이언트에서 RESTAPI 통신을 할때  Request 혹은 Response를 처리하는 함수를 Intercept 하여 로깅을 작성하든지, header를 조작하든지 하는 작업과 같은 것이라고 보면 된다.  @Aspect 어노테이션클래스에 붙이는 어노테이션으로, AOP 임을 명시한다.@Around 어노테이션함수에 붙이는 어노테이션으로 다양한 문법이 있으나, 보통 적용대상 설정을 많이 사용한다.@Around("execution(* 패키지경로..*(..))")함수는 Bean에 등록되야 하므로, @Configuration 을 이용해 등록해 준다..

Backend/SpringBoot 2024.10.30

QueryDSL

복잡한 쿼리를 동작하기 위해서 여러 방법이 있다. 앞서 작성한 @Query 를 이용하는 방법, Specification을 사용하는 방법이 있다. 이 두 방식은 프로젝트가 복잡해지면 처리가 어렵다고 하며, QueryDSL을 사용해야 한다고 한다. 해당 방법은 C#의 linqQuery와 비슷하다. 기존 Jpa 를 이용하는 Repository에, QueryDsl을 이용하는 리파지토리를 추가하여 붙인다고 생각하면 된다. 전반적인 프로세스gradle 설정 build 를 통해 Q클래스 생성JPAQueryFactory를 Bean으로 등록하기 위한 Configuration 클래스 생성QueryDSL을 사용하는 Repository interface 생성Repository Interface를 구현하는 Impl 클래스 생..

Backend/SpringBoot 2024.10.30

DB 연결 설정

application.yml 에서 DB 연결 및 속성에 대한 설정을 진행한다. # DATABASEspring: datasource: url:db접속주소(jdbc로 시작함) driverClassName:db드라이버이름(db종류에 따라 다름) username:아이디 password:비밀번호 jpa: properties: hibernate: dialect:db종류에따라 별도로 검색해서 설정 format_sql:true show_sql:true ddl-auto:update //none 등 알아서 설정Tab으로 상위 하위 구분을 해야한다. Tistory에서 탭이 제대로 표현안되어서 da..

Backend/SpringBoot 2024.10.29

테스트 코드 작성과 TDD

개인적으로는 TDD를 좋아하지 않는 입장이다. 이유는 다음과 같다.개발 하는것과 거의 같은 수준과 시간 노력을 들여 테스트코드를 짜야 한다 (즉, 일 2번 해야 한다)TDD를 통과했다고 하여 문제가 없다고 할 수 없다.TDD를 맹신하여 TDD 통과 후 테스트를 제대로 진행 하지 않고 배포할 가능성이 있다. 위의 이유로, 사람이 어짜피 테스트를 진행해야 하고, 이경우 TDD에서 발견하지 못한 문제점을 찾을 가능성이 높다.TDD 를 위해 테스트 코드를 작성하는데, 해당 코드 자체를 잘못 구현할 가능성이 있다. 이로인해 잘못된 테스트 통과가 될 수 있다.이를 검증하기위해선 또다른 시간 및 노력이 들어간다. 그러나, 부분 테스트 용도로, 개발하는 도중 Repository만 테스트 해보고 싶을때 등 테스크코드 작..

Backend/SpringBoot 2024.10.29

Query 어노테이션(JPQL) 및 JPA의 Specification

서비스 interface 를 통해 DB의 내용을 조회 해 올때, 복잡한 쿼리문을 직접 작성해야 할 경우가 있다. 직접 쿼리문을 작성하려면 @Query 어노테이션을 이용하여, Repository에 선언을 해주고, 코드로 구현한다면, Service 에 Specification을 이용해 작성해 준다. @Query 어노테이션 유의점쿼리문 작성시, 실제 DB 테이블의 컬럼명이 아닌, 엔티티의 변수명을 기준으로 작성해야 한다. (JPQL 이라고 한다)사실, 일반 쿼리문을 통해서도 쿼리를 수행할 수도 있다.nativeQuery = true 옵션을 붙여주면 된다.@Query(value = "....." , nativeQuery = true)쿼리 작성시 인자값where 절 등 인자값을 통해 쿼리문을 완성해야 할 필요..

Backend/SpringBoot 2024.10.25

Bean 어노테이션 (W.Configuration, Component 어노테이션)

Bean 어노테이션은 DI 를 위해 사용되는 어노테이션으로, 스프링부트 내부에 해당 어노테이션이 있는 클래스 내 함수를 등록해 두고, 사용처에서 @Autowired 등으로 인젝션 받아 사용할 수 있도록 한다. Bean 등록을 위해서는 두가지 방법이 있다.@Component 클래스 어노테이션 사용@Configuration 어노테이션 + @Bean 메소드 어노테이션 사용 단, Configuration 은 설정 관련 어노테이션이다. Configuration 은 싱글톤으로 사용하는것이 대부분 이므로, Bean 어노테이션을 사용한다.일반 커스텀 클래스를 등록하려면 Component 클래스 어노테이션을 쓰자Configuration 에서 사용할 클래스 예 (Bean으로 등록하는 대상이 됨)package com.exa..

Backend/SpringBoot 2024.10.25

Spring Security 기본 설정

인증 (Auth) 기능 및 보안기능을 사용하기 위한 프레임 워크이다.간략 요약build.gradle 에서 프레임워크 추가@Configuration, @EnableWebSecurity 어노테이션을 사용하는 config용 클래스 생성클래스에서 각종 시큐리티 관련 세팅 진행SecurityFilterChain을 Bean으로 등록하여 적용하는 방식을 주로 사용한다.설정을 따로 하지 않고, 기본적으로 의존성 추가만 했을경우 자동으로 동작하는 방식은 다음과 같다.루트를 포함한 모든 엔드포인트 접근시 인증 요구기본 로그인 페이지 제공 (/login)폼 로그인 활성화HTTP Basic 인증 활성화기본 로그아웃 기능 활성화 (/logout)CSRF 보호 활성화 설치 (build.gradle) implementation '..

Backend/SpringBoot 2024.10.25

DTO (W. Data, Build 어노테이션)

Data Transfer Object의 약자로서, 데이터만 전달 해준다.기본적으로 entity 항목은 DB 테이블과 매핑이 되므로 특정 항목을 제거하고 클라이언트에 전달 할 수 없다.따라서 entity를 DTO로 한번 더 감싼 후 원하는 항목들만 조합하여 클라이언트에 전달하기 위해 사용한다.혹은 다양한 entity 항목들을 하나의 DTO로 조합할 수도 있다.물론 관심도 분리등 다른이유도 있지만, 이 부분은 개발자 입장에서만 유효한 의미라 건너 뛴다.정의는 class 로 정의하고, controller 에서 DTO 생성 및 함수호출을 하여 동작한다.  정의 간단하다. DTO로 사용할 클래스를 만들고, entity로 전환하는 함수, entity를 받아 DTO를 설정하는 함수를 만들면 된다. Data 어노테이션..

Backend/SpringBoot 2024.10.24

Paging

다수의 데이터가 있을 경우, 전부를 보내주지 않고 Paging 하여 리턴 할 수 있도록 한다. 기본구조 4개중 Repository Service, Controller 세곳 모두 연관이 있다. 기본적으로 정렬과 연관이 있다. 정렬된 데이터를 리턴하기 때문이다. 페이징 방식은 크게 두개로 나뉜다페이지네이션 (offset - 시작위치 / limit - 사이즈)페이지 건너뛰어 탐색 가능앞 페이지에 데이터가 삽입 되었을 경우, 다음페이지 탐색시 중복 데이터가 노출된다.스프링부트에서 쉽게 사용할 수 있다.Page 를 사용한다기본 Page로 비즈니스 로직을 사용할 수 없다면, @Query 등으로 수동으로 쿼리문을 통해 Page와 조합하여 구현한다무한 스크롤 (커서 기반)앞의 보여준 페이지(?) 에 데이터가 삽입 ..

Backend/SpringBoot 2024.10.24