Backend/SpringBoot 81

@Mapper, @Mapping

DTO와 Entity 간 상호 변환을 위해 사용되는 어노테이션이다. MapStruct 라이브러리를 사용한다. @Mapper 는 인터페이스에 붙이는 어노테이션이고, @Mapping 은 실제 상호 변환을 하는 함수명에 붙이는 어노테이션 이다. 그래들에 다음을 추가한다.dependencies { ... implementation 'org.mapstruct:mapstruct:1.6.3' annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3'} @Mapping (source = "변수명", target = "변수명")소스 변수명을 타겟 변수명으로 치환하는 설정을 한다. 변수명이 여러개 일 경우 @Mapping 어노테이션을 해당 개수에 맞춰..

Backend/SpringBoot 2024.11.20

실행시 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