[TroubleShooting] Jackson이 싫어하는 단일 필드
·
TroubleShooting
👀 현재 상황 및 배경 설명🔽 DTO 흐름코드의 가독성과 흐름을 깔끔하게 유지하기 위해 클래스 간 정보를 전달할 때 DTO 클래스를 활용하고 있다. Swagger를 사용하고 있으므로, DTO 클래스의 명명 규칙을 백엔드 내부적으로 통일하였다.입력을 전달하는 DTO: ~Request출력을 전달하는 DTO: ~Response내부적으로 정보를 전달하는 DTO: ~Dto ▶ 구현 코드🔽 MemberRegisterRequest DTO@Getter@Builder@RequiredArgsConstructorpublic class MemberRegisterRequest { @Schema(description = "회원의 이름", example = "이소은", required = true) private ..
[TroubleShooting] 주니어 개발자들을 울게 만드는 CORS 에러
·
TroubleShooting
👀 현재 상황 및 배경 설명🔽 SecurityConfig API 요청 흐름현재 API 요청은 공개 접근 필터 체인과 인증이 필요한 필터 체인, 어드민 권한 필터 체인을 순차적으로 거치게 되어있다.공개 접근 필터 체인: 로그인 없이도 접근 가능한 엔드포인트를 처리한다.인증이 필요한 필터 체인: 로그인이 반드시 요구되는 엔드포인트를 처리한다.어드민 권한 필터 체인: 어드민만 접근할 수 있는 엔드포인트를 처리한다.🔽 CORS 설정Spring Security에서 CORS를 설정하는 방법은 크게 두 가지가 있다.CorsFilter Bean 등록CorsConfigurationSource Bean 등록현재 프로젝트에서는 CorsConfigurationSource를 사용하여 CORS를 설정했다. ▶ 구현 코드🔽..
[TroubleShooting] Spring MVC에서 정적 경로가 동적 경로로 인식되어 엔드포인트가 동작하지 않을 때
·
TroubleShooting
👀 현재 상황 및 배경 설명🔽 SecurityConfig API 요청 흐름API 요청은 공개 접근 필터 체인과 인증이 필요한 필터 체인을 순차적으로 거친다.공개 접근 필터 체인: 로그인 없이도 접근 가능한 엔드포인트를 처리한다.인증이 필요한 필터 체인: 로그인이 반드시 요구되는 엔드포인트를 처리한다.🔽 회원 정보 조회 엔드포인트현재 프로젝트에서는 회원 정보 조회를 위한 두 가지 API를 제공한다.동적 경로 API: 특정 회원 정보를 조회하는 API로, @PathVariable을 사용하여 memberId 값을 동적으로 전달받는다.정적 경로 API: 자신의 정보를 조회하는 API로, 문자열 "self"를 정적으로 경로에 사용한다.위 두 경로는 서로 다른 역할을 수행하지만, Spring MVC의 URL ..
[TroubleShooting] Cascade 옵션은 부모에게만
·
TroubleShooting
👀 현재 상황 및 배경 설명현재 프로젝트에서는 N:M 관계(다대다 관계)가 적용된 Member와 Organization 엔티티 간의 연관관계를 설정하고 있다. 중간 테이블인 OrganizationMember 테이블이 두 엔티티를 연결해주며, 이를 통해 양방향 관계가 관리된다. 중간 테이블을 통해 Member는 여러 Organization에 속할 수 있으며, 반대로 각 Organization도 여러 Member와 연관될 수 있다. 현재는 Organization 엔티티에서만 양방향 관계를 설정하여 컬렉션 필드를 관리하고 있다.또한, CascadeType 옵션을 통해 부모 엔티티 삭제 시 자식 엔티티도 자동으로 삭제되도록 구현했다. 그러나 중간 테이블인 OrganizationMember를 통해 양방향 관계를..
[TroubleShooting] 컬렉션 필드 초기화가 되지 않는 Builder 패턴
·
TroubleShooting
👀 현재 상황 및 배경 설명현재 프로젝트에서 Builder 패턴을 사용하여 엔티티 객체를 생성하고 있으며, 특히 양방향 연관관계를 설정한 Organization 엔티티에서 리스트 형태의 컬렉션 필드를 사용하고 있다. ▶ 구현 코드@Entity@Getter@Builder@NoArgsConstructor(access = AccessLevel.PROTECTED)@AllArgsConstructorpublic class Organization { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... // 양방향 연관관계 @OneToMany(mappedBy = "organization", cascade ..
[TroubleShooting] DB 쿼리 비용
·
TroubleShooting
👀 현재 상황 및 배경 설명현재 가게 사진을 업데이트하는 로직은 모든 기존 사진을 삭제한 후 새로운 사진을 덮어쓰는 방식으로 작동하고 있다.기존 사진 URL을 데이터베이스에서 모두 조회기존 사진 URL을 DB에서 모두 삭제새로운 사진 URL을 DB에 모두 저장 ▶ 구현 코드/** * 가게 사진을 업데이트합니다. */@Transactionalprotected void updateMarketImages(Market market, List imageUrls) { // 기존 사진 조회 List marketImageList = marketImageRepository.findAllByMarketId(market.getId()); // DB에서 기존 사진 URL 모두 삭제 marketImage..
[TroubleShooting] 롤백이 되지 않는 S3 Bucket
·
TroubleShooting
👀 현재 상황 및 배경 설명애플리케이션을 구현하는 과정에서 이미지를 저장해야 하는 상황이 생겼다.AWS S3 Bucket을 사용하여 이미지는 S3에 저장하고, 해당 이미지의 URL은 서버의 DB에 저장하는 방식으로 구현했다.이 방식은 스토리지와 데이터베이스의 역할을 분리함으로써, 이미지는 클라우드 스토리지에 안전하게 보관하고, 관련 메타데이터는 DB에 저장하여 서버의 부담을 줄이고 이미지 저장 및 제공 속도를 높일 수 있는 장점이 있다. ▶ 구현 코드🔽 S3에 이미지를 업로드 및 삭제하는 서비스 클래스인 S3ImageService/** * S3에 이미지를 업로드 및 삭제하는 서비스 클래스입니다. */@Service@RequiredArgsConstructorpublic class S3ImageServi..
[TroubleShooting] OAuth 로그인에서 state 파라미터를 통한 값 전달 방법
·
TroubleShooting
👀 현재 상황 및 배경 설명현재 JWT 기반 소셜 로그인을 구현 중이며, 클라이언트는 React Native로, 서버는 Spring Boot로 개발하고 있다. 소셜 로그인 버튼 클릭 시 외부 소셜 로그인 페이지로 연결되어 인증을 마친 후, 사용자 정보를 받아오는 기능을 구현했다. ▶ OAuth 로그인의 인증 흐름사용자가 클라이언트를 통해 소셜 로그인을 시도한다.클라이언트가 인증 서버로 리다이렉션하여 사용자 인증을 요청한다.사용자가 인증을 완료하면, 인증 서버는 Authorization Code를 클라이언트에 전달한다.클라이언트는 Authorization Code를 사용하여 인증 서버에 Access Token을 요청하고 발급받는다.Access Token을 사용해 리소스 서버에 사용자 정보를 요청한다.받은..
soeun2537
'TroubleShooting' 카테고리의 글 목록