
net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 이 오류는
/*<![CDATA[*/
let replyList = [[${replyList}]];
let loginUser = [[${loginUser}]];
/*]]*/
이부분에서 loginUser의 정보를 갖고오는데서 발생하는거같다.
따라서 컨트롤러로 가서 loginUser의 정보를 보려고 테스트를 해봤는데 org.hibernate.LazyInitializationException 의 오류가 발생했다.
이 오류는 불완전한 청크 인코딩 에러인데 정보 조각들을 인코딩하는 과정에서 오류가 발생한 것
즉, 내가 작성한 코드가 완전하지 못하다는 말
loginUser를 받아오는것은 오류가 발생하지않지만 replyList를 받아오는데서 오류 발생
컨트롤러에서 클라이언트와 직접적으로 데이터 교환을 할때에 entity 객체를 사용해서 데이터를 넘겨주었기때문에 오류가 발생했습니다. 주로 View 와 Controller 사이에서 데이터를 주고받을 때에는 dto로 변환해주어서 교환을 한다. dto객체를 넘겨주었지만, 여전히 오류발생
dto로 변환해서 교환을 하려했지만 dto들 역시 연관관계가 있었다. 이 연관관계를 제거하고 시도
해결, 정말 이 오류를 해결하기위해서 너무많은 시간을 사용한거같지만 그만큼 확실이 dto의 중요성과 연관관계의 중요성에 대해서 다시 한번 알고 넘어가는 기회가 되는것 같다! 결국 연관관계를 짓지않고 dto에 알맞은 정보만 넘겨주는것이 핵심이다. 또한 문제를 해결하면서 Dto가 그럼 무수히 많아지지않을까 걱정했고 그에따른 답변이다 -> https://www.inflearn.com/questions/72423/dto
org.hibernate.LazyInitializationException 이 오류는 member를 조회까지는 성공했는데, member.get MemberSocialProfiles() 를 호출해서 사용할 때 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류 입니다. JPA에서 지연로딩을 하려면 항상 영속성 컨텍스트가 있어야 한다
보통 트랜잭션 밖에서 Entity를 조회하면 이런 문제가 발생합니다.
가져오고자 하는 Entity를 조회함으로써 영속성 컨텍스트에 띄어주고 사용해서 해결
직접접으로 값을 넣어주는 것이아닌 jquery를 통해서 값을 넣어주려 했지만 계속 테이블을 벗어나는 오류가 발생했다.
for (let i = 0; i < boardList.length; i++) {
boardModalHtml += "<tr>"
boardModalHtml += "<td>" + boardList[i].id + "</td>"
boardModalHtml += "<td>" + boardList[i].title + "</td>"
boardModalHtml += "<td>" + boardList[i].hit + "</td>"
boardModalHtml += "<td>" + userId + "</td>"
boardModalHtml += "<td>" + boardList[i].createTime + "</td>"
boardModalHtml += "</tr>"
}
이렇게 만들어진 코드를 계속 div에 넣으려고 하다보니 테이블을 벗어난 것이다.
알아보니 tbody를 사용해서 넣어주면 쉽게 가능했다. html에 대해서 공부를 더 해보자, 해결
대댓글 기능을 추가하는 과정에서 댓글을 쓰는 것 까지는 진행이되지만 그 댓글에 대댓글을 작성했을때에 db로 저장되는 것 까지만 구현을 했는데 저장은 되지만 nullPointerexception이 발생했다. 댓글의 parent 속성이 null로 되어있어서 그 값을 가져오려다가 오류가 발생한거 같다. 해결해보자
reply.getParent()==null이라는 코드에서 null임을 확인할 수 있는지 알았지만 null임을 확인하기전에 getParent()를 사용하는 동시에 오류가 발생한다.
문법상 당연한 것이지만 헷갈리기 쉬운 코드인것 같다. 해결
우선 직렬화란,
자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술로써, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.
다차원의 자료를 파일로 저장하거나 네트워크로 보내기에 알맞게 일차원으로 펼치고 다시 원래대로 되돌리는 것을 직렬화(serialization)이라고 부른다.
implements Serializable 해줘서 문제를 해결하자
카카오 로그인 API를 사용중에 토큰을 발급받고 토큰을 이용해서 사용자 정보를 조회하는 것까지는 성공했으나 json 형태로 이루어진 사용자의 정보를 ObjectMapper를 사용해서 java object로 변형하는데 오류가 발생했다.
ObjectMapper objectMapper2 = new ObjectMapper();
KakaoProfile kakaoProfile = objectMapper2.readValue(responseEntity2.getBody(), KakaoProfile.class);
적용 시킨 코드와
package com.example.board_project.entity;
import lombok.Data;
@Data
public class KakaoProfile {
public Long id;
public String connected_at;
public Properties properties;
public Kakao_account kakao_account;
@Data
public class Properties {
public String nickname;
public String profile_image;
public String thumbnail_image;
}
@Data
public class Kakao_account {
public Boolean profile_nickname_needs_agreement;
public Boolean profile_image_needs_agreement;
public Profile profile;
public Boolean has_email;
public Boolean email_needs_agreement;
public Boolean is_email_valid;
public Boolean is_email_verified;
public String email;
}
@Data
public class Profile {
public String nickname;
public String thumbnail_image_url;
public String profile_image_url;
public Boolean is_default_image;
}
}
응답받은 사용자의 정보를 저장하는 KakaoProfile 클래스이다.
매핑을 하니 오류가 발생하였고 찾아보니 원인은 바로 내부 Class가 static(정적)으로 선언되지 않는 한 단독(메인 클래스를 참조하지 않고)으로 내부 Class의 디폴트 생성자를 호출해 인스턴스를 생성할 수 없고 값을 매핑할 수도 없었던것이다. 즉, 위와 같은 예외를 피하려면 내부 Class를 별도의 클래스로 생성하던가, 아니면 static 내부 Class로 선언해주어야 한다. 해결
수정
package com.example.board_project.entity;
import lombok.Data;
@Data
public class KakaoProfile {
public Long id;
public String connected_at;
public Properties properties;
public Kakao_account kakao_account;
@Data
static class Properties {
public String nickname;
public String profile_image;
public String thumbnail_image;
}
@Data
static class Kakao_account {
public Boolean profile_nickname_needs_agreement;
public Boolean profile_image_needs_agreement;
public Profile profile;
public Boolean has_email;
public Boolean email_needs_agreement;
public Boolean is_email_valid;
public Boolean is_email_verified;
public String email;
}
@Data
static class Profile {
public String nickname;
public String thumbnail_image_url;
public String profile_image_url;
public Boolean is_default_image;
}
}
- 로그 확인하기 - 로그는 뒤에서 부터 쌓인다 cat 함수 활용 - cd /opt/codedeploy-agent/deployment-root/deployment-logs 확인!(echo 내용도 표시됨)
- 내가 만든 스크립트가 제대로 실행하고있는지 위치와 설정한 변수명을 제대로 확ㅇ니
- 현재 애플리케이션이 실행되고있는지 확인 ps -ef | grep [프로젝트 명]
- codedeploy가 실패하면 오류를 알려주니 확인
해결
즉 url에 //가 경로는 포함되는 경우는 안될 금지 문자열로 추가되어 있었다.
시큐리티의 기본 구현체인 StrictHttpFirewall 에서는, 악성 URL로 인한 사이드 이펙트를 최소화하기 위해 아래 수많은 문자들이 포함된 URL은 아예 거부하고 있기 때문이다.
public class SecurityConfig {
@Bean
RequestRejectedHandler requestRejectedHandler() {
return new HttpStatusRequestRejectedHandler();
}
}
스프링 스큐리티 5.4이상 부터는 위에 구문을 추가해주면 통과할 수 있다고 했다.
추가해주고 돌려보니
이번에는 타임리프에서 오류를 발생시킨다.
오류를 찾아보니 이것또한 url에 // 가 들어가서 path 해석이 불가능하다고 한다.
나는 분명히 //같은 url을 사용한 적이 없어서 알아보니

view에 대한 path를 즉 리턴값을 다음과 같이 /baord/detail으로 했었기 때문에 //board/detail 이라고 인식해서 url에 //이 들어가는 오류에 대해서 나왔던 것이다.
로컬에서는 오류 없이 지나가서 헷갈렸던 부분이다.
수정해보자.

리턴부분을 / 제거 하고 진행했을때에

정상적으로 타임리프가 작동한다.
view에 대한 path를 작성할때에는 맨처음에 / 를 제거하고 작성해주는 것을 기억하자
해결
package com.qkrtprjs.springbootproject.web.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@Builder
@AllArgsConstructor
//@NoArgsConstructor
public class PostsUpdateRequestDto {
private String title;
private String content;
}
작성해주고 테스트를 돌려봤는데 Cannot construct instance of~ 라는 오류가 발생했다.
내가 생각할때에는 Builder는 생성자가 필요했고 모든 필드값을 파라미터로 갖고있는 생성자를 만들어주는 AllArgsConstructor를 사용해주었으니 빌더를 사용할 수 있다 라고 생각했지만 바로 오류가 발생했다
오류가 발생한 이유는
spring은 기본적으로 직렬화/역직렬화에 잭슨 라이브러리를 기본으로 사용하고 있고 그 잭슨 라이브러리는 기본생성자가 없으면 동작하지 않습니다.
라는 조건이 있었다.
따라서 잭슨의 object mapper는 기본생성자를 필요로한다!
때문에 @NoArgsContructor까지 추가해줘야 정상적으로 Builder를 사용할 수 있다. 해결
이런 유용한 정보를 나눠주셔서 감사합니다.