본문 바로가기

내일배움캠프 4기 스프링/내배캠 TIL📘

12. 28 코딩 테스트 입문/ 스프링 심화 강의 + 자바 ORM 표준 JPA 프로그래밍

728x90

1. 코딩 테스트 입문

배열 원소의 길이

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<Integer> solution(String[] strlist) {
        List<Integer> answer = new ArrayList<>();
        for (String s : strlist) {
            int cnt = 1;
            for (int j = 1; j <= s.length(); j++) {
                if (j < s.length()) {
                    cnt = cnt + 1;
                } else {
                    answer.add(cnt);
                }
            }
        }
        return answer;
    }
}

보다 간단한 풀이는 스트림을 활용한 풀이가 있다. 나중에 스트림으로 다시 시도해보자

2. 스프링 심화 강의 + 자바 ORM 표준 JPA 프로그래밍

1) AOP

어제에 이어 오류 해결 : 

java.lang.IllegalStateException: Failed to execute ApplicationRunner

Caused by: java.lang.IllegalArgumentException: 저장할 수 있는 상품명이 없습니다.

 

상품명을 받아오는 데 실패하여 원인을 찾아보니, ProductRequestDto에서 생성자메서드 초기화를 하는 부분에서 itemDto를 참조하지 않고 초기화만 하여 값이 빈 값으로 전달되다 보니 실행이 되지 않았다.

 

스프링 AOP 어노테이션의 종류

2) Exception

https://ryanclaire.blogspot.com/2020/10/HTTP-Overview.html

 

HTTP 프로토콜 구조 개요와 예제

HTTP 프로토콜 구조 개요와 예제

ryanclaire.blogspot.com

주요 응답상태코드 종류

200번대 : 성공

400번대 : 클라이언트 에러, 잘못된 요청

500번대 : 서버 에러, 요청은 정확하지만 서버 에러로 오류 발생

 

강의 진행 중 만난 오류

object references an unsaved transient instance - save the transient instance before flushing:

 

@ManyToOne 또는 @OneToMany 매핑을 사용 할때 부모에 추가하는 자식 개체가 아직 영속되지 않아 생긴 

영속성 전이(CASCADE) 문제, 참조하는 객체를 저장하지 않아 생기는 문제 ~ 저번에도 만났던 문제

https://cdaosldk.tistory.com/107

기존 해결 : cascade.ALL로 해결할 수 있지만, 다른 부분에도 영향을 쉽게 받을 수 있다고 하여 fetch를 사용한 방법으로 시도 -> 시도했더니 값이 제대로 저장되지 않았다. -> 도움을 받은 끝에 fetch를 사용하고 생성자에 @Builder를 추가하고 post객체에 setter로 comment 주입 후 그 코멘트를 코멘트 리스트에 저장하는 방식 사용 : 해결

다만,

- setter를 사용한 점

- cascade는 되는데 fetch는 왜 영속성 관리에서 안되는지 정확히 이해하지 못하고 고친 점

이 아직 문제로 남아있다.

 

+ 책을 참조하여 문제 탐색 및 해결 노력

 

이번 시도 :

1) 연관관계 설정된 컬럼에 @ManyToOne(fetch=fetchType.LAZY) 설정 : 변화 없음

2) 저장이 문제라는 생각이 들어 @OneToMany(cascade = CascadeType.PERSIST) 사용+CascadeType.ALL 도 변화없음

3) 스프링 시큐리티 복습 필요성 : 

원인 - ShopController에서 인수로 설정했던 User 타입 객체.. 강의를 따라 내용을 수정하는 과정에서 잘못 수정이 들어갔었다. @AuthenticationPrincipal UserDetailsImpl 타입 객체를 인수로 설정했더니 성공.

+ 예외 로그를 읽는 방법을 복습하고 그에 대한 이해도를 조금 더 높힐 수 있었다.

https://velog.io/@sonaky47/Spring-Security-Jwt-%ED%86%A0%ED%81%B0%EC%A0%95%EB%B3%B4%EB%A1%9C-%ED%95%84%ED%84%B0%EB%A7%81-%EB%90%9C-%EC%9C%A0%EC%A0%80%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC%EB%8B%A8%EC%97%90%EC%84%9C-AuthenticationPricipal-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%84-%ED%86%B5%ED%95%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94%EB%B2%95

 

[Spring Security] Jwt 토큰정보로 필터링 된 유저정보를 컨트롤러단에서 @AuthenticationPricipal 어노테이

사연 스프링 시큐리티에서 Jwt 토큰정보로 필터링 된 SecurityContext 정보를 컨트롤러 단에서 SecurityContext.getContext() 함수를 통해 복잡하게 가져오지 말고 @AuthenticationPrincipal 어노테이션을 통해 직접

velog.io

 

728x90