목록분류 전체보기 (61)
개발 기록이

1. AES 알고리즘대칭키 암호화 방식으로 암호화와 복호화에 동일한 키를 사용한다. 이 키는 비밀로 유지되어야 하며 암호화된 데이터는 키를 알고 있는 사람만 복호화할 수 있다. AES 알고리즘 중 AES-256을 사용하여 256비트(32바이트) 키로 더 강력한 보안 방법을 적용해보려고 한다. 2. 암복호화하기import java.util.Base64;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;public class CipherExample { public static void main(String[] args) throws Exception { // AES-256을 사용하려면 키 길이가 32바이트(256비트)여야 함. Stri..

1. public vs private public: 누구나(어디서든) 접근 가능private: private이 선언된 메서드나 변수가 속한 클래스 안에서만 접근 가능public class PrivateTest { public static void main(String[] args) { Cafe cafe = new Cafe(); cafe.orderCoffee(); // 커피 주문하기(호출 가능) // cafe.makeCoffee(); // private라서 호출 불가 } public static class Cafe { private void makeCoffee() { // 카페 관계자만 사용 가능(커피 만들기) Sy..

여러 사람에게 메일 발송을 하는 것처럼 반복적인 작업을 동기 방식으로 처리하면, 각 작업이 완료될 때까지 블로킹이 발생하여 전체 처리 시간이 늘어날 수 있다. ExecutorService를 활용한 비동기 처리에 대해 알아보자. 병렬 작업과 스레드풀병렬 작업(여러 작업을 동시에 처리) 증가 → 스레드 개수 증가 → CPU, 메모리 사용량↑ → 성능 저하병렬 작업 시 스레드풀을 사용하여 스레드 수 제어가 필요하다. 스레드풀(ThreadPool)의 동작제한된 개수의 스레드를 사용하여, 작업이 끝난 후에는 해당 스레드를 재사용하여 성능 저하를 막아준다. 자바에서 스레드풀 사용ExecutorService 인터페이스를 통해 스레드풀을 관리한다.Executors 클래스를 사용하여 다양한 유형의 스레드풀을 생성한다.*..

1. 테이블 복사1) 테이블 복사(테이블 구조 + 데이터) SELECT * INTO [새로 생성할 테이블명] FROM [원본 테이블명] SELECT * INTO [new_table] FROM [orgin_table] 2) 테이블 복사(테이블 구조만 복사) SELECT * INTO [새로 생성할 테이블명] FROM [원본 테이블명] WHERE 1=2SELECT * INTO [new_table] FROM [orgin_table] WHERE 1=2-- WHERE 1=2 는 항상 false -> 데이터는 복사가 안 됨 3) 테이블 복사(데이터만 복사) INSERT INTO [복사한 데이터를 넣을 테이블명] SELECT * FROM [원본 테이블명]INSERT INTO [new_table] SELECT * F..

1. 클라이언트 사이드 렌더링(CSR, Client Side Rendering)1. 브라우저 -> 서버에 콘텐츠 요청사용자가 웹사이트에 접근하면 브라우저는 서버에 페이지 로딩을 위한 HTML, CSS, JS 등의 콘텐츠를 요청한다.2. 서버가 기본 HTML 파일을 보냄서버가 웹페이지의 기본 구조가 담긴 HTML 파일을 브라우저에 보낸다. (이 HTML 파일은 내용이 거의 비어 있고, 기본적인 틀만 가지고 있는 상태)3. 브라우저가 자바스크립트 파일 다운로드 및 실행브라우저는 HTML에 포함된 자바스크립트 파일 링크를 통해 서버에서 자바스크립트 파일을 추가로 다운로드한다. 자바스크립트가 실행되면서 필요한 데이터를 서버에 다시 요청한다.4. 자바스크립트가 동적으로 페이지를 생성 및 표시자바스크립트는 서버에서..

최근 리액트를 사용하면서 ES5 이상 JavaScript 문법을 사용하고 있는데 그중에서 옵셔널 체이닝 연산자에 대해 정리해보려고 한다. 옵셔널 체이닝(?.)은 ES11(ECMAScript 2020)에서 도입된 연산자로 중첩된 객체의 속성에 접근할 때 에러 없이 안전하게 접근할 수 있게 해 준다. null이나 undefined가 있을 경우 에러를 발생시키지 않고 대신 undefined를 반환시킨다. let user = {};console.log(user.info.tel); // Uncaught TypeError: Cannot read properties of undefined (reading 'tel')console.log(user && user.info && user.info.tel); // undef..
다음표와 같이 회원정보별 구입한 물품이 있다고 가정해 보자.회원아이디구입상품정렬값user1 마우스1user1키보드3user1아이스크림4user1과자5user1꽃2user2커피6user2음료수8user2펜7user2신발11user2거울10user2가방9 GROUP_CONCAT를 사용해서 유저별 구입상품을 products라는 이름으로 하나의 문자열로 결합할 수 있다. 결합할 컬럼의 구분자는 SEPARATOR 뒤에 지정해준다.SELECT USER_ID, GROUP_CONCAT(PRODUCT SEPARATOR ', ') AS PRODUCTSFROM PURCHASES_TBGROUP BY USER_ID 특정 정렬값에 따라 정렬된 상태로 문자열을 묶으려면, 결합할 컬럼 바로 뒤에 ORDER BY 절을 추가하면 된다..

1. 서버 IP 가져오기InetAddress.getLocalHost()import java.net.InetAddress;import java.net.UnknownHostException;public class ipTest { public static void main(String args[]) throws UnknownHostException { InetAddress ipnetAddr = InetAddress.getLocalHost(); System.err.println("현재 아이피 : " + ipnetAddr.getHostAddress()); System.err.println("현재 hostname : " + ipnetAddr.getHostName()); }}..

window.open('url','name','options') 1. url : 새 창으로 띄울 웹페이지 url 2. name: 새 창 이름_blank : 새 창으로 열린다.(기본값)_parent : 부모 프레임에 열린다._self : 현재 페이지를 대체한다._top : 현재 페이지에서의 최상의 페이지에서 새 창이 열린다.name(임의의 이름) : 새 창이 열리고 창의 이름을 지정한다. 3. options : 창의 크기, 위치, 툴바 및 기타 속성을 지정한다. 속성들은 쉼표로 구분하여 사용하면 된다.width: 창의 너비height: 창의 높이top: 창의 상단 위치left: 창의 왼쪽 위치resizable: 창의 크기 조절 가능 여부scrollbars: 스크롤바 표시 여부 예제 코드window.open..

Oracle에서 DECODE와 CASE문을 이용하여 조건문을 처리할 수 있다. 1. DECODESELECT DECODE(POSITION, '부장', UNISTR('책임'), POSITION) AS POSITION_NMFROM EMP_TB;SELECT DECODE(DEPART_ID, 100, '인사팀', 200, '디자인팀', 300, '영업팀', '기타') AS DEPART_NMFROM EMP_TB; * UNISTR 함수문자열을 유니코드 형식으로 변환하여 다양한 인코딩 환경에서도 인코딩이 깨지지 않고 올바르게 표시될 수 있도록 한다. 2. CASESELECT CASE DEPART_ID ..