진짜 바보같은 실수지만 그래도 기록은 해야지... passport를 이용해 구글 login을 구현하던 중 save 단계에서 무한 츠쿠요미가 발생하는 문제가 발생했다.const googleStrategyConfig = new GoogleStrategy({ clientID: googleClientID, clientSecret: googleClientSecret, callbackURL: googleCallbackURL, scope: ['email', 'profile']}, (accessToken, refreshToken, profile, done) => { console.log("profile = ", profile) User.findOne({googleId: profile.i..
DTO에 담겨있는 LocalDateTime을 직렬화 하지 않고 그냥 ResponseBody에 넣어버리니 다음과 같이 list 형식으로 넘어가버리더라.이를 해결하기 위해 CustomLocalDateTimeSerializer를 제작하고 Server에서 문자열에서 포메팅해 Discord bot으로 넘겨주는 로직을 작성했다. DTOpackage study.surviveoutsidethejunglespring.algorithm.dto;import static study.surviveoutsidethejunglespring.config.JacksonConfig.*;import java.time.LocalDateTime;import com.fasterxml.jackson.databind.annotation.JsonS..
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' annotationProcessor 'org.projectlombok:lom..
옵시디언!노션도 언젠간 vim 모드를 지원해주겠지 라는 맘으로 1년을 기다려왔다...더이상 버틸수가 없어 vim 모드를 지원하는 obsidian으로 건너가 vim을 사용해보는데 이게 웬일, 줄 간격이 완전 지 멋대로 작용되서 한번에 4줄 5줄이 건너뛰어지는 현상이 발생했다. 해결방법해결 방법은 생각보다 간단했다. 1. vimrc support 플러그인 설치 2. vault를 생성해준 root 폴더에 .obsidian.vimrc 파일 생성나같은 경우에는 iclude에 기본으로 생성되있더라 3. 해당 파일에 다음 내용 추가" Have j and k navigate visual lines rather than logical onesnmap j gjnmap k gk" I like using H and L for..
@Slf4j @RequiredArgsConstructor @RestController @RequestMapping("/api/my") public class MemberApiController { private final MemberService memberService; @PatchMapping("/hospital") @ResponseStatus(HttpStatus.OK) public String appendFavorites( @AuthenticationPrincipal UserDetails principal, @RequestParam("hospitalSeq") Long hospitalSeq ) { log.info("=========================={}====================..
문제의 컨트롤러 @PostMapping("/post") // redirect 시 ResponseStatus 어노테이션을 붙이면 redirect가 실행되지 않습니다. // @ResponseStatus(HttpStatus.CREATED) public String createReview( @Valid RequestReviewFormDto requestReviewFormDto ) { reviewService.createReview(requestReviewFormDto); return "redirect:/my/reviews"; } @ResponseStatus를 이용해 상태코드를 같이 전송할시 redirect가 실행되지 않는 오류를 겪었다. 이유는 ResponseStatus는 Body에 상태값을 실어서 보내지만 타..
Spring Data JPA에서 JpaRepository를 extends 해줄때 선언해준 객체를 준수하지 않고 Integer 타입을 반환하려고 했을때 해당 오류가 발생했다. 문제의 코드 package com.playdata.eungae.appointment.repository; import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa...
beautifulsoup로 웹 스크래핑을 하다 비동기 요청을 하는 웹에서는 데이터가 받아지지 않음을 깨닫고 셀레니움을 사용해보았다. 하지만 셀레니움을 사용하며 맞닥드린 문제가 hidden으로 숨겨져 있고 LazyLoading이 걸려있는 페이지는 src의 경로를 반환하는 것이 아닌 base64로 엔코딩이 된 바이너리 타입이 반환되는것을 확인했다. 이를 해결하기 위해 온갖 사이트를 돌아다녀봤지만 마땅한 해답을 찾지 못하던 와중 innerHTML로 모든 HTML코드를 반환받아봤다. 뜻밖에도 src가 아닌 data-original-src로 경로가 설정되어있는 모습을 확인할 수 있었다. 그렇게 get_attribute('data-original-src') 로 반환을 받은 결과 야호 해결이다 최종 코드 from s..
저번 포스팅에서 OneToOne 관계의 주인에서는 지연로딩이 적용되지만 주인이 아니면 지연로딩이 적용되지 않고 EAGER로 데이터가 불러오는 문제에 대해서 다뤄봤다. 그렇다면 해결방법은 뭐가 있을까? 내가 생각한 방법은 OneToOne 연관관계에서 주인이 아닌 쪽에 Long 타입으로 주인의 Seq를 저장하는것이다. @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicInsert @Getter @Table(name = "appointment") @Entity @Builder public class Appointment extends BaseEntity { @GeneratedValue(strategy = Generati..
프로젝트를 진행하다가 OneToOne 관계에서 FetchType.LAZY를 설정해주었음에도 즉시 로딩이 실행되 N+1 문제가 발생하는것을 확인했다. 문제의 Entity들 @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "review") @Entity @Builder public class Review extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long reviewSeq; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "hospita..