'Development/Diary' 카테고리의 글 목록 (4 Page)
본문 바로가기

Development/Diary

(32)
[개발 일기] java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter String token = Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(new Date(now.getTime() + tokenValidMillisecond)) .signWith(SignatureAlgorithm.HS256, secretKey) // 암호화 알고리즘, secret 값 세팅 .compact(); 이 코드의 signWith() 에서 아래 에러가 발생했다. java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 해결 방법 아래 의존성 추가하기 Maven은 javax.xml.bind jaxb-api 2.3.1 Gradle은 implementation 'java..
[개발 일기] 이게 왜 null이 아니야 (영속성 컨텍스트에서 같은 Entity를 참조!) 테스트 코드 공부 중에 의아한 점.Product givenProduct = Product.builder() .name("note") .price(1000) .stock(500) .build(); System.out.println("before save = " + givenProduct.getNumber()); // when Product savedProduct = productRepository.save(givenProduct); // then System.out.println("after save = " + givenProduct.ge..
[Diary] Primary key 타입은 숫자랑 GUID(UUID)중에 어떤 걸 쓸까요? 설문조사 엔티티의 ID 타입은 숫자 Or GUID(UUID)?졸업 프로젝트 진행중에 나왔던 대화 주제입니다.설문조사 게시글의 Id 타입을 무엇으로 할지...사실 그 당시에는 GUID 타입에 대해서도 처음 접해봐서 잘 몰랐는데 지금 다시 떠올라서 GUID에 견해에 대해 써보려합니다.GUID(UUID)?GUID는 'Globally Unique Identifier'의 약자로, '전역적으로 고유한 식별자'라는 뜻입니다.GUID는 128비트의 크기를 가지며, 이는 전 세계 어디에서든 고유하게 생성될 수 있는 값을 의미합니다. GUID는 주로 여러 데이터베이스나 서버 간에 데이터를 고유하게 식별하거나 병합할 필요가 있을 때 사용됩니다. 예를 들어, 여러 서버에 분산되어 있는 데이터베이스에서 각 레코드를 고유하게 식..
[개발 일기] OSIV가 false일 때 LazyInitializationExceptions 이거 때매 거의 이틀을 삽질했다.... 이해가 안되어서.... OSIV=false + getReferenceId - @Transactional = LazyInitializationExceptions 문제의 코드 @Override public Product selectProduct(Long number) { Product selectedProduct = productRepository.getReferenceById(number); return selectedProduct; }다음과 같이 getReferenceById()를 사용한 객체를 리턴하고, @Override public ProductResponseDto getProduct(Long number) { Product product = productDAO..
[개발 일기]JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. (OSIV Anti Pattern) 스프링을 다시 공부하려고 새 프로젝트를 만들어서 바로 실행만 했더니, 이런 경고가 발생했습니다. WARN 6264 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 뤼튼(GPT 4)에게 물어봤는데 답변은 이러했습니다. 이 경고 메시지는 Spring Boot에서 'spring.jpa.open-in-view' 설정이 기본적으로 활성화되어..
[개발일기]Python은 멀티쓰레딩 언어인데 GIL은 왜멀티쓰레딩을 막도록 설계되었나요? 그리고 Python 3.12 Per-interpreter GIL 인턴 생활을 하면서 Python의 대해 공부를 좀 했었는데, Python은 멀티쓰레딩 언어임에도 GIL라는 장치는 마치 단일 쓰레딩만 가능하도록 설계가 되었다는 것을 알았습니다. 왜 멀티쓰레딩 언어임에도 이를 막고자 설계가 되었는지 시니어 개발자분께 여쭤본 기억이 있는데요, 마침 최근 Python 3.12에는 Interpreter improvements의 사항으로 PEP 684, a unique per-interpreter GIL 가 있더라구요! 이 글에서는 GIL과 per-interpreter GIL 에 대해 다루고자 합니다. GIL 파이썬은 메모리 관리를 위해 참조 계수(reference counting)를 사용합니다. 이는 파이썬에서 생성된 객체가 해당 객체를 가리키는 참조의 개수를 추적하는 참조 ..
[개발일기] 이 코드에서 Semaphore 사용하는 이유가 무엇인가요? Semaphore? 세마포어(Semaphore)는 컴퓨터 시스템 내에서 다수의 프로세스 간의 활동을 조정하기 위해 사용되는 일반적인 변수입니다. 세마포어는 상호 배제(Mutual Exclusion)를 강제하고 경쟁 조건(Race Condition)을 피하며 프로세스 간 동기화를 구현하는 데 사용됩니다. 세마포어를 사용하는 과정에는 "wait"와 "signal" 두 가지 연산이 포함됩니다. wait 연산은 세마포어의 값을 감소시키며, signal 연산은 세마포어의 값을 증가시킵니다. 세마포어의 값이 0인 경우, wait 연산을 수행하는 프로세스는 다른 프로세스가 signal 연산을 수행할 때까지 블록됩니다. 세마포어는 임계 영역(Critical Section)을 구현하는 데 사용되며, 이는 코드의 일부를 ..
[개발 일기][Spring]Spring Security에서 AccessDeniedHandler 와AuthenticationEntryPoint Spring Security는 유저에 대한 인증 및 권한처리를 가능하게 해주는 spring 보안 프레임워크입니다. 저는 프로젝트를 진행하면서 @RestControllerAdvice를 사용해 전역적으로 예외 처리를 하도록 하였으나, 기대한 HTTP status code와 에러 메시지와는 달리 403 Fobidden만 응답받을 뿐이었습니다. 이 문제는 User가 로그인을 하지 않은 채, 서비스의 접근할 경우 발생한 예외였습니다. 즉 인증되지 않은 클라이언트가 서버에 요청을 보냈을 때의 발생한 상황이었습니다. 조사해 보니 Spring Security의 Filter Chain으로 발생한 예외는 서블릿 필터 단계에 속하는 부분이기 때문에 @RestControllerAdvice와 같은 어노테이션으로 예외 처리를 ..