WEB
-
2023-11-18 1. 원인 Spring를 빌드하다 보면 아래와 같은 WARN 이 뜨는 경우가 있다. 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 해당 부분을 살펴보자. OSIV(View의 Open Session)는 그림과 같이 View 계층이 프록시 초기화를 트리거할 수 있도록 지속성 콘텍스트를 열어두도록 강제한다. 쉽게 표현하자면 JPA의 영속..
[Spring] 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 해결 방법2023-11-18 1. 원인 Spring를 빌드하다 보면 아래와 같은 WARN 이 뜨는 경우가 있다. 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 해당 부분을 살펴보자. OSIV(View의 Open Session)는 그림과 같이 View 계층이 프록시 초기화를 트리거할 수 있도록 지속성 콘텍스트를 열어두도록 강제한다. 쉽게 표현하자면 JPA의 영속..
2023.11.18 -
2023-10-27 1. 주요 빌드 정보 implementation 'org.springframework.boot:spring-boot-starter-websocket' implementation 'org.webjars:sockjs-client:1.1.2' implementation 'org.webjars:stomp-websocket:2.3.3-1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' //순수 HTML 사용 시 불필요 implementation 'org.springframework.boot:spring-boot-starter-freemarker' implementation 'org.webjars.bower:boo..
[Spring] 스프링 부트 STOMP 채팅 + 채팅방 구현 Ver.12023-10-27 1. 주요 빌드 정보 implementation 'org.springframework.boot:spring-boot-starter-websocket' implementation 'org.webjars:sockjs-client:1.1.2' implementation 'org.webjars:stomp-websocket:2.3.3-1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' //순수 HTML 사용 시 불필요 implementation 'org.springframework.boot:spring-boot-starter-freemarker' implementation 'org.webjars.bower:boo..
2023.10.27 -
2023-09-22 1. 방법 숨겨진 textarea의 auto 설정으로 새롭게 입력받은 input 값에 따라 높이를 계산하고 이후 실제 textare에 적용한다. 실제 textarea에 바로 적용하지 않는 이유는 바로적용 시 auto 속성 값으로 인해 웹창에 스크롤도 같이 이동하기 때문이다.
[JavaScript] textArea 자동 크기 조절 방법 (resize)2023-09-22 1. 방법 숨겨진 textarea의 auto 설정으로 새롭게 입력받은 input 값에 따라 높이를 계산하고 이후 실제 textare에 적용한다. 실제 textarea에 바로 적용하지 않는 이유는 바로적용 시 auto 속성 값으로 인해 웹창에 스크롤도 같이 이동하기 때문이다.
2023.09.22 -
2023-09-18 1. 방법 GetServerSideProps으로 데이터를 가져온 후 input에 데이터를 넣고 있었는데, 해당 데이터가 없을 경우 페이지 상에서는 오류가 나지 않지만 콘솔에서는 아래와 같은 오류가 발생하고 있었다. Warning: `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components. 위와 같은 오류가 발생시 데이터가 없을 경우 default로 넣어줄 값을 선언해 주면 해당 오류는 사라지게 된다. 아래와 같은 방법으로 값을 넣어주면 된다. value={userName || ''} 이렇게 데..
[Next.js] Warning: `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components. 오류 해결2023-09-18 1. 방법 GetServerSideProps으로 데이터를 가져온 후 input에 데이터를 넣고 있었는데, 해당 데이터가 없을 경우 페이지 상에서는 오류가 나지 않지만 콘솔에서는 아래와 같은 오류가 발생하고 있었다. Warning: `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components. 위와 같은 오류가 발생시 데이터가 없을 경우 default로 넣어줄 값을 선언해 주면 해당 오류는 사라지게 된다. 아래와 같은 방법으로 값을 넣어주면 된다. value={userName || ''} 이렇게 데..
2023.09.18 -
2023-09-14 1. 방법 contenteditable 을 이용한 태그에 붙여넣기를 하면 일반 텍스트가 아닌 html 형태로 들어가게 되는데 이를 일반 텍스트가 들어갈 수 있게 변경하는 방법을 알아보자. 위 코드는 해당 요소에 붙여 넣기 이벤트를 감지하고, 붙여 넣은 텍스트를 HTML 태그 없이 해당 요소에 삽입하며, 텍스트를 붙여 넣을 때 HTML 태그 속성을 포함하지 않도록 할 수 있다. 메인 이미지 출처 : 사진: Unsplash의Ori Song
[JavaScript] contenteditable 붙여넣기 텍스트만 넣기2023-09-14 1. 방법 contenteditable 을 이용한 태그에 붙여넣기를 하면 일반 텍스트가 아닌 html 형태로 들어가게 되는데 이를 일반 텍스트가 들어갈 수 있게 변경하는 방법을 알아보자. 위 코드는 해당 요소에 붙여 넣기 이벤트를 감지하고, 붙여 넣은 텍스트를 HTML 태그 없이 해당 요소에 삽입하며, 텍스트를 붙여 넣을 때 HTML 태그 속성을 포함하지 않도록 할 수 있다. 메인 이미지 출처 : 사진: Unsplash의Ori Song
2023.09.14 -
2023-09-08 1. 방법 onError 키워드를 사용하면 현재 리소스가 존재하지 않았을 경우에 노출할 수 있는 이미지를 설정 할 수 있다. 메인 이미지 출처 : 사진: Unsplash의NEOM
[HTML] img 태그 리소스 404 및 불러올 수 없을때 처리방법2023-09-08 1. 방법 onError 키워드를 사용하면 현재 리소스가 존재하지 않았을 경우에 노출할 수 있는 이미지를 설정 할 수 있다. 메인 이미지 출처 : 사진: Unsplash의NEOM
2023.09.08 -
2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JQuery 가져오는 방법 https://seeminglyjs.tistory.com/525 [JQuery] 선택된 라디오 버튼만 checked 되게 설정하기 2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 메인 이미지 출처 : 사진: Unsplash의David Clode seeminglyjs.tistory.com 메인..
[JavaScript] 선택된 라디오 버튼만 checked로만들기2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JQuery 가져오는 방법 https://seeminglyjs.tistory.com/525 [JQuery] 선택된 라디오 버튼만 checked 되게 설정하기 2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 메인 이미지 출처 : 사진: Unsplash의David Clode seeminglyjs.tistory.com 메인..
2023.09.07 -
2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JavaScript로 가져오는 방법 https://seeminglyjs.tistory.com/526 [JavaScript] 선택된 라디오 버튼만 checked로만들기 2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JQuery 가져오는 방법 https://seeminglyjs.tistory. seeminglyjs..
[JQuery] 선택된 라디오 버튼만 checked 되게 설정하기2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JavaScript로 가져오는 방법 https://seeminglyjs.tistory.com/526 [JavaScript] 선택된 라디오 버튼만 checked로만들기 2023-09-07 1. 방법 prop 를 사용해 우선 해당 클래스의 버튼들을 checked false로 만든 이후 선택된 라디오 버튼만 checked 로 만들면 된다. Option 1 Option 2 Option 3 2. JQuery 가져오는 방법 https://seeminglyjs.tistory. seeminglyjs..
2023.09.07 -
2023-08-20 1. 원인 "Type 'bigint' is not assignable to type 'ReactNode'" 오류는 일반적으로 TypeScript와 React를 함께 사용할 때 발생하는 문제입니다. 이 오류는 ReactNode 타입과 bigint 타입 간의 호환성 문제를 나타내는데, ReactNode는 React 컴포넌트가 반환하는 모든 유형의 요소를 나타내는 데 사용되는 TypeScript 타입입니다. 해당 오류는 주로 JSX나 컴포넌트에서 bigint 타입의 값을 ReactNode로 사용하려고 했기 때문입니다. 2. 방법 아래의 두가지 방식으로 해결 할 수 있습니다. const myBigInt: bigint = BigInt(1234567890); // ... {myBigInt.toS..
[TypeScript] Type 'bigint' is not assignable to type 'ReactNode' 해결 방법2023-08-20 1. 원인 "Type 'bigint' is not assignable to type 'ReactNode'" 오류는 일반적으로 TypeScript와 React를 함께 사용할 때 발생하는 문제입니다. 이 오류는 ReactNode 타입과 bigint 타입 간의 호환성 문제를 나타내는데, ReactNode는 React 컴포넌트가 반환하는 모든 유형의 요소를 나타내는 데 사용되는 TypeScript 타입입니다. 해당 오류는 주로 JSX나 컴포넌트에서 bigint 타입의 값을 ReactNode로 사용하려고 했기 때문입니다. 2. 방법 아래의 두가지 방식으로 해결 할 수 있습니다. const myBigInt: bigint = BigInt(1234567890); // ... {myBigInt.toS..
2023.08.20 -
2023-08-07 1. 오류 SpringBoot의 별다른 설정없이 최초 실행하면 아래와 같은 오류가 발생하는 경우가 있다. 이 오류는 Spring Boot 애플리케이션이 데이터베이스 연결 구성을 찾을 수 없을 때 발생한다. 기본적으로 Spring Boot는 데이터베이스 연결 설정을 기대하며, 이에 대한 구성이 없을 경우 해당 오류가 발생한다. *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be conf..
[Spring] boot DataSource미사용 처리 하는 방법2023-08-07 1. 오류 SpringBoot의 별다른 설정없이 최초 실행하면 아래와 같은 오류가 발생하는 경우가 있다. 이 오류는 Spring Boot 애플리케이션이 데이터베이스 연결 구성을 찾을 수 없을 때 발생한다. 기본적으로 Spring Boot는 데이터베이스 연결 설정을 기대하며, 이에 대한 구성이 없을 경우 해당 오류가 발생한다. *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be conf..
2023.08.07 -
2023-07-29 1. 정의 즉시 실행 함수 표현(IIFE, Immediately Invoked Function Expression)은 정의되자마자 즉시 실행되는 Javascript Function 를 말한다. 이는 Self-Executing Anonymous Function 으로 알려진 디자인 패턴이고 크게 두 부분으로 구성된다. 첫 번째는 괄호((), Grouping Operator)로 둘러싸인 익명함수(Anonymous Function)이다. 이는 전역 스코프에 불필요한 변수를 추가해서 오염시키는 것을 방지할 수 있을 뿐 아니라 IIFE 내부안으로 다른 변수들이 접근하는 것을 막을 수 있는 방법이다. 두 번째 부분은 즉시 실행 함수를 생성하는 괄호()이다. 이를 통해 자바스크립트 엔진은 함수를 즉..
[JavaScript] 즉시 실행 함수 표현(IIFE) 알아보기.2023-07-29 1. 정의 즉시 실행 함수 표현(IIFE, Immediately Invoked Function Expression)은 정의되자마자 즉시 실행되는 Javascript Function 를 말한다. 이는 Self-Executing Anonymous Function 으로 알려진 디자인 패턴이고 크게 두 부분으로 구성된다. 첫 번째는 괄호((), Grouping Operator)로 둘러싸인 익명함수(Anonymous Function)이다. 이는 전역 스코프에 불필요한 변수를 추가해서 오염시키는 것을 방지할 수 있을 뿐 아니라 IIFE 내부안으로 다른 변수들이 접근하는 것을 막을 수 있는 방법이다. 두 번째 부분은 즉시 실행 함수를 생성하는 괄호()이다. 이를 통해 자바스크립트 엔진은 함수를 즉..
2023.07.29 -
2021-06-29 1. 방법 정해진 interval 마다 분기 처리를 하면 로딩효과를 낼 수 있다. // 동적으로 내용 변경하는 함수 function updateDynamicContent() { let testSpan = $('.testSpan'); let currentContent = testSpan.text(); if (currentContent === '.') { testSpan.text('. .'); } else if (currentContent === '. .') { testSpan.text('. . .'); } else { testSpan.text('.'); } } // 0.3초마다 내용 변경 setInterval(updateDynamicContent, 400); 메인 이미지 출처 : 사진:..
[JavaScript] 자바스크립트를 . . . 로딩 함수 만들기2021-06-29 1. 방법 정해진 interval 마다 분기 처리를 하면 로딩효과를 낼 수 있다. // 동적으로 내용 변경하는 함수 function updateDynamicContent() { let testSpan = $('.testSpan'); let currentContent = testSpan.text(); if (currentContent === '.') { testSpan.text('. .'); } else if (currentContent === '. .') { testSpan.text('. . .'); } else { testSpan.text('.'); } } // 0.3초마다 내용 변경 setInterval(updateDynamicContent, 400); 메인 이미지 출처 : 사진:..
2023.06.29 -
2023-06-28 1. 방법 자바스크립트를 통해 특정 태그의 disabled를 조회하고 이를 추가하거나 제거하는 방법을 공유한다. // 요소의 disable 속성을 추가하는 함수 function addDisableAttribute(elementSelector) { let element = document.getElementById(elementSelector); if (element) { element.disabled = true; } } // 요소의 disable 속성을 제거하는 함수 function removeDisableAttribute(elementSelector) { let element = document.getElementById(elementSelector); if (element) { ..
[JavaScript] 자바스크립트 disabled 제어 방법(조회/추가/삭제)2023-06-28 1. 방법 자바스크립트를 통해 특정 태그의 disabled를 조회하고 이를 추가하거나 제거하는 방법을 공유한다. // 요소의 disable 속성을 추가하는 함수 function addDisableAttribute(elementSelector) { let element = document.getElementById(elementSelector); if (element) { element.disabled = true; } } // 요소의 disable 속성을 제거하는 함수 function removeDisableAttribute(elementSelector) { let element = document.getElementById(elementSelector); if (element) { ..
2023.06.28 -
2023-06-21 1. 방법 부모 창에서 자식 창 열기 자식 창을 열 때, 부모 창에서 변수를 설정하여 전달합니다. 예를 들어, child.html을 열 때 URL에 프래그먼트 값을 추가하여 전달할 수 있습니다. var fragmentValue = "전달할 값"; var childUrl = "child.html#" + fragmentValue; window.open(childUrl, "popup"); 자식 창에서 부모 창으로 데이터 전달 자식 창에서 window.opener를 사용하여 부모 창에 접근할 수 있습니다. var fragmentValue = window.location.hash.substring(1); // 프래그먼트 값 가져오기 window.opener.receiveData(fragment..
[JavaScript] 자식창의 정보를 부모창에 전달하는 방법2023-06-21 1. 방법 부모 창에서 자식 창 열기 자식 창을 열 때, 부모 창에서 변수를 설정하여 전달합니다. 예를 들어, child.html을 열 때 URL에 프래그먼트 값을 추가하여 전달할 수 있습니다. var fragmentValue = "전달할 값"; var childUrl = "child.html#" + fragmentValue; window.open(childUrl, "popup"); 자식 창에서 부모 창으로 데이터 전달 자식 창에서 window.opener를 사용하여 부모 창에 접근할 수 있습니다. var fragmentValue = window.location.hash.substring(1); // 프래그먼트 값 가져오기 window.opener.receiveData(fragment..
2023.06.21 -
2023-06-14 1. 방법 현재 URL 정보를 가져오는 방법은 window.location 객체를 사용하는 것입니다. window.location 객체는 현재 페이지의 URL과 관련된 정보를 제공합니다. 아래의 속성을 사용하여 다양한 정보를 얻을 수 있습니다: window.location.href: 전체 URL을 반환합니다. window.location.protocol: 프로토콜 (예: "http:", "https:")을 반환합니다. window.location.host: 호스트 이름과 포트를 반환합니다. window.location.hostname: 호스트 이름을 반환합니다. window.location.port: 포트 번호를 반환합니다. window.location.pathname: 경로 부분을 ..
[JavaScript] 현재 URL 정보를 가져오는 방법들2023-06-14 1. 방법 현재 URL 정보를 가져오는 방법은 window.location 객체를 사용하는 것입니다. window.location 객체는 현재 페이지의 URL과 관련된 정보를 제공합니다. 아래의 속성을 사용하여 다양한 정보를 얻을 수 있습니다: window.location.href: 전체 URL을 반환합니다. window.location.protocol: 프로토콜 (예: "http:", "https:")을 반환합니다. window.location.host: 호스트 이름과 포트를 반환합니다. window.location.hostname: 호스트 이름을 반환합니다. window.location.port: 포트 번호를 반환합니다. window.location.pathname: 경로 부분을 ..
2023.06.14 -
2023-06-10 1. AUTO 기본값이며, 데이터베이스에 맞는 자동 생성 전략을 사용합니다. 주로 MySQL의 AUTO_INCREMENT, Oracle의 SEQUENCE 등과 같이 데이터베이스의 기능을 활용하여 기본 키를 생성합니다.데이터베이스마다 지원하는 자동 생성 전략이 다를 수 있습니다. 2.IDENTITY 데이터베이스의 IDENTITY 컬럼을 사용하여 기본 키를 생성합니다. 주로 MySQL, SQL Server, PostgreSQL 등에서 지원됩니다. 데이터베이스가 기본 키를 자동으로 생성하는 경우에 사용됩니다. 3.SEQUENCE 데이터베이스의 시퀀스를 사용하여 기본 키를 생성합니다. 주로 Oracle, PostgreSQL 등에서 지원됩니다. 시퀀스는 일련번호를 생성하는 객체로, 각각의 값이..
[Spring] @GeneratedValue(strategy = GenerationType."타입") 알아보기.2023-06-10 1. AUTO 기본값이며, 데이터베이스에 맞는 자동 생성 전략을 사용합니다. 주로 MySQL의 AUTO_INCREMENT, Oracle의 SEQUENCE 등과 같이 데이터베이스의 기능을 활용하여 기본 키를 생성합니다.데이터베이스마다 지원하는 자동 생성 전략이 다를 수 있습니다. 2.IDENTITY 데이터베이스의 IDENTITY 컬럼을 사용하여 기본 키를 생성합니다. 주로 MySQL, SQL Server, PostgreSQL 등에서 지원됩니다. 데이터베이스가 기본 키를 자동으로 생성하는 경우에 사용됩니다. 3.SEQUENCE 데이터베이스의 시퀀스를 사용하여 기본 키를 생성합니다. 주로 Oracle, PostgreSQL 등에서 지원됩니다. 시퀀스는 일련번호를 생성하는 객체로, 각각의 값이..
2023.06.10 -
2023-06-09 1. 방법 let textArray = []; function handleClick(event) { let clickedDiv = event.target; let textValue = clickedDiv.innerText; if (textArray.includes(textValue)) { // 이미 클릭된 div인 경우 textArray = textArray.filter(item => item !== textValue); // 배열에서 해당 텍스트 값 제거 clickedDiv.style.backgroundColor = ""; // 배경색 원래대로 복구 } else { // 처음 클릭하는 div인 경우 textArray.push(textValue); clickedDiv.style.bac..
[JavaScript] 태그(ex div) 클릭 시 텍스트 값 가져오는 방법2023-06-09 1. 방법 let textArray = []; function handleClick(event) { let clickedDiv = event.target; let textValue = clickedDiv.innerText; if (textArray.includes(textValue)) { // 이미 클릭된 div인 경우 textArray = textArray.filter(item => item !== textValue); // 배열에서 해당 텍스트 값 제거 clickedDiv.style.backgroundColor = ""; // 배경색 원래대로 복구 } else { // 처음 클릭하는 div인 경우 textArray.push(textValue); clickedDiv.style.bac..
2023.06.09 -
2023-06-06 1. 방법 한글 인코딩 필요 없는 경우는 아래와 같이 $.ajax({ url: downloadUrl, method: "GET", dataType: "text", success: function(response) { // 텍스트 응답을 받았을 때 실행되는 코드 // response 변수에는 텍스트 데이터가 들어있습니다. // 파일 다운로드를 위한 Blob 객체 생성 var blob = new Blob([response], { type: "text/csv;charset=utf-8;" }); // 파일 다운로드 링크 생성 var downloadLink = document.createElement("a"); downloadLink.href = URL.createObjectURL(blob); ..
[jQuery] ajax로 window.location.href = "CSV 파일 다운로드" 구현2023-06-06 1. 방법 한글 인코딩 필요 없는 경우는 아래와 같이 $.ajax({ url: downloadUrl, method: "GET", dataType: "text", success: function(response) { // 텍스트 응답을 받았을 때 실행되는 코드 // response 변수에는 텍스트 데이터가 들어있습니다. // 파일 다운로드를 위한 Blob 객체 생성 var blob = new Blob([response], { type: "text/csv;charset=utf-8;" }); // 파일 다운로드 링크 생성 var downloadLink = document.createElement("a"); downloadLink.href = URL.createObjectURL(blob); ..
2023.06.06 -
2023-05-28 1. 방법 주석으로 //QueryDSL이라고 적혀 있는 부분만 추가해서 넣어주면 된다. 두 줄 이상 연속 된 부분은 //QueryDSL START 와 //QueryDSL END라고 적혀 있다. buildscript { ext{ kotlin_version = '1.8.20-Beta' queryDslVersion = "5.0.0" // QueryDSL } repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" } } plug..
[Gradle] Spring Boot에서 QueryDSL 5.0.0 적용하는 방법2023-05-28 1. 방법 주석으로 //QueryDSL이라고 적혀 있는 부분만 추가해서 넣어주면 된다. 두 줄 이상 연속 된 부분은 //QueryDSL START 와 //QueryDSL END라고 적혀 있다. buildscript { ext{ kotlin_version = '1.8.20-Beta' queryDslVersion = "5.0.0" // QueryDSL } repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" } } plug..
2023.05.28 -
2023-05-07 1. 이슈 토이 프로젝트에서 AOP 적용 중 Caused by: java.lang.IllegalArgumentException: Cannot subclass final class . . . 와 같은 에러가 발생했다. 기존에 java 클래스 파일에서는 문제가 없으나 Kotiln 클래스 파일은 모두 에러가 발생했다. 해당 에러는 표시된 것과 같이 Final Class의 경우 AOP가 CGLIB(Code Generator Library)를 이용해 런타임에 동적으로 자바 클래스에 따른 프록시를 생성해주지 못하기 때문이다. 즉 Kotiln 클래스 파일의 경우 default로 final 키워드가 선언되기 때문에, 동적 생성이 불가해서 생기는 이슈인 것으로 확인 되었다. 그렇다면 아래와 같이 지금..
[Spring] Kotiln + Spring 에서 AOP 적용 시 Caused by: java.lang.IllegalArgumentException: Cannot subclass final class 이슈 해결2023-05-07 1. 이슈 토이 프로젝트에서 AOP 적용 중 Caused by: java.lang.IllegalArgumentException: Cannot subclass final class . . . 와 같은 에러가 발생했다. 기존에 java 클래스 파일에서는 문제가 없으나 Kotiln 클래스 파일은 모두 에러가 발생했다. 해당 에러는 표시된 것과 같이 Final Class의 경우 AOP가 CGLIB(Code Generator Library)를 이용해 런타임에 동적으로 자바 클래스에 따른 프록시를 생성해주지 못하기 때문이다. 즉 Kotiln 클래스 파일의 경우 default로 final 키워드가 선언되기 때문에, 동적 생성이 불가해서 생기는 이슈인 것으로 확인 되었다. 그렇다면 아래와 같이 지금..
2023.05.07