전체 글

개발 일지
1. @ModelAttribute put 메소드로 처리되었던 프로필 변경을 patch로 변경하는 작업 중 사용한 어노테이션이다 MultipartFile인 프로필 사진이 requestDto에 포함되어있기 때문에 json만 지원하는 @RequestBody는 사용할 수 없었고, 각각의 프로필 요소를 하나하나 @RequestParam 이나 @RequestPart로 하기는 싫었어서 찾아보다가 발견했다 문제는 요청을 받아 서비스 단에서 열어보니 dto의 모든 값이 null로 떴다. 해결은 두가지로 가능 dto에 @NoArgsConstructor가 있다면 @ModelAttribute 내부적으로 setter를 찾아 값을 세팅한다고 한다 따라서 @AllArgsConstructor가 있어도 @NoArgsConstructo..
1. Python APScheduler from apscheduler.schedulers.background import BackgroundScheduler sched = BackgroundScheduler() sched.add_job(메소드명, 'cron', day_of_week='mon-fri', hour='16', id='renew_index') sched.start() while True: time.sleep(1) 내 프로젝트의 경우 지속적으로 백그라운드에서 스케줄링하므로 BackgroundScheduler 사용 BlockScheduler도 있음 어떤 작업을 할지는 add_job()에 메소드 명을 넣거나, 아래와 같이 메소드 위에 어노테이션 붙이기 cron 형식으로 날짜나 요일, 시간 설정함 @s..
1. 몽고db - 스프링 스프링에서 mongodb atlas 연결 1. mongodb atlas 에서 connect my application에서 java와 버전 선택후 url 가져오기 2. mongodb atlas 에서 해당 클러스터 db connection, network connection에서 권한과 ip주소 잘 설정하기 3. 스프링 application.properties 잘 설정 후 나의 경우에는 깃헙 secrets에 잘 업데이트 하고 배포하기 코드 // build.gradle // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb implementation group: 'org...
미루던 til 한번에 몰아쓰기... 1. 지연 로딩 관련 에러 게시글 - 댓글 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.innovation.stockstock.entity.Post.comments, could not initialize proxy - no Session 양방향 1:N 연관관계인 상황에서 모두 지연로딩으로 설정하니 게시글을 통해 댓글을 조회할 때 (게시글 상세조회) 트랜잭션이 끝나고 나서 댓글 프록시 객체가 초기화 시도하여 댓글 정보를 불러오지 못하는 문제가 생김 게시글에서 즉시 로딩 전략을 사용해 바로 가져올 수도 있지만, 대부분의 경우 댓글 정보는 필요가 ..
1. javadoc 6주차때 주석 관련해서 이런 것이 있다는 것을 소개 받아 추후에 공부가 필요할 것 같아 언급 2. gitignore 처음부터 gitignore에 application.properties를 반영하지 않은 상황에서는 깃헙에 계속 업데이트된다 git rm --cached C:/Users/~파일 위치~/src/main/resources/application.properties 해당 파일의 위치를 복사하여 위 명령어를 사용하면 반영됨 같이 작업하는 개발자들에게 필요할 때 gitignore된 파일의 내용을 그때그때마다 공유해주어야 하는 것 같다. 물론 깃 액션을 활용해 배포할 때에는 gitignore을 사용하면 안 될 것이다 3. 구글 로그인 https://maivve.tistory.com/33..
JPQL SQL을 추상화한 객체 지향 쿼리 언어 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 엔티티 객체를 대상으로 쿼리 특정 DB SQL에 의존하지 않음 결국에는 SQL로 변환된다 오타에 취약하고, 동적 쿼리 생성에 어려움이 있다 (그냥 String이기 때문) Criteria(JPA 공식 기술): JPQL 빌더 (실무 사용 X) -> QueryDSL 사용 권장 em.createQuery("쿼리문", 반환 객체) QueryDSL(오픈 소스) 문자가 아닌 자바코드로 JPQL 작성 (JPQL 빌더 역할) 컴파일 시점에 문법 오류 발견 가능 동적 쿼리 작성 편리 공식 사이트에 친절하게 정리되어 있음 네이티브 SQL JPA가 제공하는 SQL을 직접 사용 JPQL로 해결할 ..
기본값 타입 JPA의 데이터 타입 분류 엔티티 타입: @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입: int, Integer, String과 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전 대체 값 타입 분류 기본값 타입 임베디드 값 타입 컬렉션 값 타입 기본값 타입 예) String name, int age 생명주기가 엔티티에 의존 회원 엔티티 삭제 시 이름, 나이 필드 함께 삭제 값 타입은 공유하면 안됨 예) 회원 이름 변경 시 다른 회원의 이름도 변경되면 안됨 참고: int, double 같은 기본 타..
1. ResponseEntity 사용 // 7주차 응답 형식 ResponseEntity.ok().body("200 응답 바디 메세지"); ResponseEntity.badrequest().body("400 응답 바디 메세지"); // body() 안에는 미리 설정했던 ResponseDto나 적절한 String으로된 메세지를 담았다 // JwtAuthenticationEntryPoint class HttpServletResponse response; response.setStatus(400) // 추가 2. Leetcode DFS 589번 class Solution: def preorder(self, root: 'Node') -> List[int]: if root is None: # 예외 처리 return..
프론트와 처음 협업해보고 클론코딩 주차 중에 있다. 미니 프로젝트는 그렇게 만족스럽지 못한 결과물이었지만 배운 점은 꽤 있었다고 생각한다. 프로젝트 설계 단계에서 API 명세서의 중요성을 다시 한번 더 깨달았다. 백 끼리만 협업할 때도 중요했던 부분인데, 프론트까지 이 명세서에서 URL, 변수명, 요청 및 응답 형식 등 통신에 필요한 부분이 많기 때문이다. 기능을 생각하면서 명세서를 잘 작성할수록 이후 과정들이 훨씬 순탄하고, ERD 작성할 때도 더 편하다. 그래도 나 같은 경우는 명세서를 수정할 때마다 챗으로 계속 공유했기 때문에 이 부분은 나름 잘했다고 생각한다. 코드 짜는 부분에 있어서는 크게 어려운 점이 없었지만, 프론트에 대한 이해도가 더 필요하다는 것을 확실히 체감한 주차였던 것 같다. COR..
인텔리제이 force push 활성화 File > Settings > Version Control > Git > Push > Protected branches: main으로 설정된 것을 지우면 main 브랜치에 force push 가능 (브랜치 보호를 풀었다가 force push 한 이후 다시 보호 설정해주는 것이 좋을 것 같다)
hjkim0502
CODELOG