본문 바로가기

컴퓨터 프로그래밍/Spring46

[Spring] Swagger UI 적용 🌱 Swagger UISwagger UI는 RESTful API를 문서화하고 시각적으로 표현하기 위한 도구다. API의 엔드포인트, 요청 및 응답 형식 등을 사용자에게 쉽게 이해할 수 있는 형태로 보여준다.  🌱 Swagger UI 장점자동 문서화: Swagger UI는 API 코드에 주석을 추가하거나 Swagger Annotation을 사용하여 자동으로 API 문서를 생성한다. 이를 통해 개발자들은 코드 변경 시 문서도 함께 업데이트할 수 있다.인터랙티브: Swagger UI는 사용자가 API를 직접 테스트할 수 있는 인터페이스를 제공한다. 사용자는 요청을 보내고 응답을 확인할 수 있어 API의 동작을 쉽게 이해할 수 있다.시각적 표현: API의 엔드포인트, 요청 및 응답 모델을 시각적으로 표시하여.. 2024. 11. 2.
[Spring] Soft Delete 📚 배경1. 탈퇴한 회원의 계정으로 중복 계정 생성을 막을 때2. 데이터 분석을 위해서 탈퇴한 회원에 대한 데이터가 필요할 때3. 서비스 정책 상 탈퇴한 유저의 정보를 정해진 기간동안 유지할 필요가 있을 때 등 위와 같은 이유로 soft Delete 가 사용된다.직접 User Entity 에 userStatus 라는 필드를 만들어서 삭제 유무를 파악했었는데, Spring Boot 에서 이를 지원해주기 때문에 활용하는 방법에 대해서 알아보았다.User@Getter@Entity@SQLDelete(sql = "UPDATE users SET deleted = true WHERE id = ?")@SQLRestriction("deleted = false")@NoArgsConstructor@Table(name = .. 2024. 11. 2.
[Spring] 페이지네이션 정리 코드 Controller// 식물사전 리스트 조회@GetMapping("/v1/dictionaries")public ResponseEntity>> getDictionaryList( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { return ResponseEntity.ok(ApiResponse.success(dictionaryService.getDictionaryList(page, size)));} 🎯 @RequestParam 으로 page, size 를 받고 defaultValue 를 설정함으로서 다른 입력이 없으면 기본 값을 설정해준다. 🎯 Page 로 반환하.. 2024. 10. 23.
[Spring] Discord 알림 구현 webhookControllerpackage com.sparta.springusersetting.domain.webhook.controller;import com.sparta.springusersetting.domain.webhook.service.WebhookService;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@RequiredAr.. 2024. 10. 16.
[Spring] TransactionalEventListener ManagerRegistLogService@Transactional(propagation = Propagation.REQUIRES_NEW)@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)public void ManagerRegistLog(ManagerRegistLogEvent managerRegistLogEvent) { ManagerRegistLog managerRegistLog = ManagerRegistLog.createManagerRegistLog( managerRegistLogEvent.getTodoTitle(), managerRegistLogEvent.getUserEmail(.. 2024. 10. 11.
[Spring] Projection 및 예시코드 설명 entity 전체의 값을 가져오는 것이 아닌 조회 대상을 지정해 원하는 값만 조회할 수 있도록 지원하는 클래스DB조회 시 select * from table 간에 사용되는 * 가 모든 필드를 가져오므로, 불필요한 메모리 낭비가 될 수 있음. Projections 사용법 4가지bean: setter로 주입하며, 필드명이 일치해야함field: setter 없이 주입 가능하며, 필드명이 일치해야함constructor생성자 기반으로 삽입하여, 네이밍 상관 없이 생성자 필드순으로 바인딩생성자에 입력한 값 순서로 확인하기 때문에 컴파일 시점에 오류 확인이 불가하여, 런타임 간에 발견될 수 있음바인딩 DTO에 @QueryProjection가 있으면 컴파일 시점에 entity와 마찬가지로 Q클래스를 생성미리 생성된 Q.. 2024. 10. 7.
[Spring] Spring Security 환경세팅build.gradleimplementation 'org.springframework.boot:spring-boot-starter-security'testImplementation 'org.springframework.security:spring-security-test' spring secrity 를 사용하기 위한 의존성 주입JwtUtil@Slf4j(topic = "JwtUtil")@Componentpublic class JwtUtil { private static final String BEARER_PREFIX = "Bearer "; private static final long TOKEN_TIME = 60 * 60 * 1000L; // 60분 @Value("${jwt.secr.. 2024. 10. 4.
[Spring] QueryDSL 타입 안전한 동적 쿼리를 직관적으로 작성할 수 있게 도와주는 Java 기반 쿼리 라이브러리환경세팅build.gradledependencies { // querydsl implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"}QueryDslConfig.java@Configurationclass Qu.. 2024. 10. 3.
[Spring] Lazy Loading 과 Eager Loading 의 차이, N+1 Problem 과 해결 방법 1. Lazy Loading (지연 로딩)특징: 연관된 엔티티를 필요할 때 로드함. 처음에는 관련 데이터가 로드되지 않고, 실제로 데이터를 사용할 때 쿼리가 실행됨.장점: 불필요한 데이터를 미리 로드하지 않으므로 성능에 유리함. 데이터 접근이 적을 때 효과적이다.단점: 연관 데이터에 접근할 때마다 쿼리가 발생해 N+1 문제가 발생할 수 있다.2. Eager Loading (즉시 로딩)특징: 연관된 엔티티를 즉시 로드함. 엔티티가 조회될 때 모든 연관된 데이터도 한 번에 가져온다.장점: 한 번에 모든 데이터를 로드하여 추가 쿼리가 발생하지 않는다. 필요할 때 미리 로드된 데이터를 사용할 수 있다.단점: 불필요한 데이터를 미리 로드하기 때문에 성능이 저하될 수 있다. 데이터가 많을 때는 비효율적이다.N+1 .. 2024. 10. 3.
[Spring] Password Encoder 사용법 SignUpRequestDto@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[\\p{Punct}])[A-Za-z\\d\\p{Punct}]{8,20}$", message = "비밀번호는 최소 8자리 이상, 영문, 특수문자를 1자 이상 포함되어야 합니다.")@NotBlank(message = "비밀번호를 입력해주세요.")private String password; Dto 에서 위와 같이 입력해서 비밀번호 패턴을 제한할 수 있다.PasswordEncoder@Componentpublic class PasswordEncoder { public String encode(String rawPassword) { return BCrypt.withDef.. 2024. 9. 29.
[Spring] OAuth2.0 Kakao 소셜 로그인 기능 구현 준비 단계1. Kakao Developer 에서 어플리케이션을 생성하고 Web 플랫폼 등록 에서 사이트 도메인을 입력해준다. 2. 카카오 로그인을 했을 때 인가코드를 전달 받을 Redirect URI ( callback ) 을 설정해준다.  인가코드를 전달받을 Controller 의 요청으로 보내주면 된다.3. 사용자로부터 받을 정보를 선택해준다.  https://kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code 인가코드를 받기 위해서 해당 REST_API_KEY 와 Redirect_URI 를 해당 애플리케이션과 callback 설정한 uri 를 맞춰서 넣어준다. Res.. 2024. 9. 29.
[Spring] S3 기능 구현 build.gradle// AWS S3implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' S3Config@Configurationpublic class S3Config { @Value("${s3.credentials.access-key}") private String accessKey; @Value("${s3.credentials.secret-key}") private String secretKey; @Value("${s3.credentials.region}") private String region; @Bean public AmazonS3Client s3Client(.. 2024. 9. 28.
[Spring] Entity 연관관계 설정 코드 일대일 양방향 예시코드Keyword@OneToOne@JoinColumn(name = "LOCKER_ID")private Locker locker;다대일 양방향 예시코드Keyword@OneToMany(mappedBy="parent")private List childList;@ManyToOne@JoinColumn(name = "parent_id")private Parent parent; 중간테이블 양방향 예시코드Keyword@ManyToOne@JoinColumn("parent_id")private Parent parent;@ManyToOne@JoinColumn("child_id")private Child child; 2024. 9. 27.
[Spring] GlobalExceptionHandler UserServiceif (!passwordEncoder.matches(deleteUserRequestDto.getPassword(), user.getPassword())) { throw new UnauthorizedPasswordException();} 비밀번호가 일치하지 않을 때 비밀번호 불일치 메세지를 던지기 위해서 예외처리를 했다. UnauthorizedPasswordExceptionpublic class UnauthorizedPasswordException extends GlobalException { public UnauthorizedPasswordException() { super(UNAUTHORIZED_PASSWORD); }} GlobalExceptionCons.. 2024. 9. 22.
[Spring] ApiResponse 예시 코드 분석 package com.sparta.sweethoney.util;import com.fasterxml.jackson.annotation.JsonInclude;import lombok.Getter;import lombok.RequiredArgsConstructor;import org.springframework.validation.BindingResult;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;import java.util.HashMap;import java.util.List;import java.util.Map;@JsonInclude(JsonInclude.Include... 2024. 9. 21.