목록java (81)
삶 가운데 남긴 기록 AACII.TISTORY.COM
자바 웹 프로젝트를 이클립스에서 Refactor를 통해 이름을 변경하더라도 Context root와 Deploy 이름을 자동으로 변경해주지 않습니다. 그래서! 프로젝트 이름을 변경하려면 Context root와 Deploy 이름을 수동으로 변경해주어야 합니다. Web context root는 이클립스 메뉴의project>properties>web project settings 에서 변경합니다. 프로젝트명과 deploy명이 다를 땐 해당 프로젝트 폴더를 열고.settings/org.eclipse.wst.common.component를 편집하고 이클립스를 재시작 합니다.
1. java.net.URL 클래스java.net.URL 클래스는 네트워크상의 URL과 자원을 처리합니다.웹 페이지, 이미지, 동영상, 스크립트 등 다양한 형태의 자원을 다룰 수 있습니다.또한 URL 문자열을 객체로 표현하고 다양한 정보를 추출하는 데 사용됩니다.중요 기능URL 문자열 파싱 및 객체 생성: URL 문자열 자체를 파싱하여 객체를 생성합니다.URL 정보 추출: URL의 프로토콜, 호스트, 포트, 경로, 쿼리 문자열 등 다양한 정보를 추출할 수 있습니다.자원 접근: openConnection() 메서드를 통해 URL에 해당하는 자원에 대한 연결을 생성하고, openStream() 메서드를 통해 입력 스트림을 얻어 자원의 내용을 읽을 수 있습니다.URL 유효성 검사: toExternalForm(..
1. JRE 런타임 실행 옵션자바 application을 실행할 때 JRE 실행 옵션으로 변수 값을 지정할 수 있습니다.-DmyVariable=변수 값이런 식으로 지정 할 수 있는데 System.getProperty("myVariable");같이 System.getProperty()를 이용하여 실행 중인 application 내에서 해당 변수 값을 읽어서 언제든 사용할 수 있습니다.이 변수 값을 다시 설정하려면 System.setProperty("myVariable", "value");이런 식으로 실행 중에 setProperty(key, value)으로 변수 값을 변경할 수도 있습니다.예를 들어 아래 Application이 runnable jar로 MainEx.jar 라고 빌드 되었다고 가정하고java ..
# Jasypt(Java Simplified Encryption)Jasypt는 자바 애플리케이션에서 간단한 암호화/복호화를 수행하기 위한 라이브러리입니다.주로 프로퍼티파일이나 xml 등 설정 파일의 계정 정보 같은 문자열 데이터를 암호화/복호화하는 데 사용합니다.내부적으로 양방향 암호화와 단방향(Hash) 암호화를 조합하여 비교적 높은 수준의 암호화/복호화를 간편하게 사용할 수 있습니다.암호화키를 안전하게 저장하고 노출되지 않도록 주의해야 합니다.텍스트와 바이너리 모두 암호화/복호화 할 수 있습니다.Spring Security와도 연동 가능하며 멀티 스레드로부터 안전합니다. # 의존성 추가여기서는 1.9.3 버전 기준으로 합니다.maven의 경우 org.jasypt jasypt 1.9.3..
Visitor 패턴개요 및 장점Visitor 패턴은 형태가 거의 변경되지 않는 객체(데이터 구조)에서 처리 로직이 자주 변경되는 경우, 객체들의 구조와 알고리즘을 분리하여 적용할 수 있게 해 줍니다. 이 패턴은 객체의 클래스에서 알고리즘을 분리하여 새로운 알고리즘을 추가하거나 수정할 때 기존 코드를 수정하지 않고도 가능하게 합니다. Visitor 패턴은 새로운 기능을 추가하기 위해 기존 객체 구조를 변경할 필요 없이 새로운 방문자 클래스를 추가하면 됩니다.객체 구조에 대한 다양한 작업을 별도의 방문자 클래스로 분리하여 객체 구조와 방문자 클래스 사이의 결합도를 낮춰 코드 유지 관리를 용이하게 합니다. Visitor 패턴의 활용컴파일러: 소스 코드를 분석하고 변환하는 과정에서 방문자 패턴을 사용하여 각 문..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/9iRup/btsHhqXFthg/W6KIKbDfKkqRr7R767FZQ1/img.png)
SWT Text 위젯org.eclipse.swt.widgets.Text 위젯은 간단한 텍스트를 입력받을 때 사용하는 위젯입니다.addModifyListener() : 텍스트를 수정했음을 알리기 위한 리스너를 추가addSelectionListener() : 컨트롤이 선택되었음을 알리기 위한 리스너를 추가addVerifyListener() : 텍스트에 변화가 일어났는지 검증하기 위한 리스너를 추가append() : 현 텍스트에 주어진 문자열을 추가insert() : 현 텍스트를 주어진 문자열로 대체copy(), cut(), paste() : 선택된 문자들을 클립보드로 옮기거나 클립보드의 내용으로 대체setSelection(), selectAll() : 코드 상에서 직접 선택 영역을 설정setEchoChara..
MyBatisMybatis는 내부적으로 JDBC를 이용해서 preparedStatement 실행시키는 방식으로 구동되는 프레임워크입니다.매퍼 xml 파일에 SQL문을 작성하고 관리하기 때문에 자바 소스에서 SQL문을 작성할 필요가 없어서 SQL을 수정했을 때 프로젝트를 다시 빌드를 할 필요가 없습니다.리소스 생성과 해제, try-catch 등 JDBC를 사용할 때의 반복 작업을 줄여줍니다.SQL를 직접 작성하기 때문에 ORM(JPA) 방식보다 SQL쿼리를 튜닝하는 등 복잡한 쿼리를 다룰 때 더 적합합니다. MyBatis 구조설정 파일(mybatis-config.xml): 데이터 베이스 설정과 트랜잭션 등 동작 규칙을 정의하는 파일입니다.매퍼 xml 파일: SQL 구문을 정의하고 namespace와 id..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cSPAYZ/btqESW5nyD4/xnPLTF3EkPD8Mc6twokX9K/img.png)
싱글톤 패턴: 하나의 인스턴스만 사용하기 위한 디자인 패턴, 스레드 풀링, 커넥션 풀링 등에서 주로 사용합니다. 인스턴스를 생성할 때 참조 변수를 private static으로 합니다. 생성자를 private로 한다. 이는 외부에서 new로 인스턴스를 생성하지 못하게 합니다. 인스턴스를 리턴하는 public static getInstance() 메서드를 제공합니다. 이 메서드 내부에서 인스턴스를 생성할 때 null 체크 후 생성해서 인스턴스를 리턴 해야 합니다. 멀티스레드 환경에서는 위 getInstance메서드를 synchronized 해야 안전합니다. 하지만 전반적인 성능 저하 때문에 일반적으로 아래와 같은 패턴으로 코딩합니다. 싱글톤패턴1 public class InitializationOnDema..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bK8ZXM/btsDHnwX7wG/xggkxXbfscf39Zn7ERhBuk/img.png)
이벤트 처리는 이벤트를 전달하는 이벤트 클래스와 이벤트를 처리하는 리스너가 담당합니다. JFace는 이런 이벤트 처리를 간단하게 해줍니다. SWT 에서 이벤트 처리 SWT는 운영체제의 이벤트 큐를 사용합니다. Application의 Display클래스는 해당 큐의 내용을 정렬하는데 readAndDispatch()와 msg 필드를 사용합니다. msg필드는 운영체제의 메시지 큐에 대한 핸들로 동작합니다. 해당 이벤트를 최상위 Shell 객체로 보내고 Shell객체는 어떤 위젯이 해당 이벤트를 받을지 결정합니다. Shell은 해당 위젯으로 이벤트를 보내고 해당 위젯은 이 정보를 리스너 라는 인터페이스로 전달합니다. 그러면 리스너는 이벤트 핸들러를 호출해 이벤트에 필요한 동작을 수행합니다. Adapter 클래스..
Composite 클래스 컨테이너 위젯은 GUI의 배경 구조를 구성하고 모듈식 코드를 제공합니다. 여러 composite 객체가 다른 composte 객체에 결합될 수 있습니다. Composite 클래스의 메소드 getChildren() : Control 객체의 배열을 반환 getLayout() : composite에 연결한 레이아웃을 반환 setLayout(Layout) : composite에 연결할 레이아웃을 설정 getTabList() : 탭 순서에 따른 Control 객체의 배열을 반환 setTabList(Control[]) : Composite의 위젯들의 탭 순서를 설정 Composite 클래스는 Scrollable 클래스의 하위 클래스 입니다. 그래서 모든 Composite 클래스는 스크롤바를..
자바로 파일을 다루다 보면 파일 이름으로 금지된 문자들을 걸러낼 필요가 있습니다. 그래서 만들어 봤습니다. 제가 쓰려고요. //파일명으로 금지된 문자들을 검사 public static boolean isContainsForbiddenChar(String input) { // 금지된 문자들 배열 char[] forbiddenChars = { '/', '\\', '*', '"', '', '|' }; // 입력 문자열에 금지된 문자가 포함되어 있는지 검사 for (char forbiddenChar : forbiddenChars) { if (input.contains(String.valueOf(forbiddenChar))) { return true; } } // 금지된 문자가 없는 경우 return false;..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/kB9H8/btqERQ57zG7/lCGEXDouv1uG2rlKBfCD51/img.png)
Thread dump는 언제 해야 하는 가? 1. Java 어플리케이션이 Hang 상태가 될 때 Hang 상태는 Java 어플리케이션의 Thread들이 멈춰있는 상황입니다. Shared Resource의 접근할 경우 다른 Thread가 사용할 수 없도록 Lock을 획득하며, 또한 이러한 Lock을 다른 Thread들이 이미 획득하고 있을 경우, Lock을 획득하기 위해 대기하게 됩니다. Java에서의 Lock은 내부 Monitor를 통해 관리되기 때문에 Monitor 획득이 Lock 획득을 의미합니다. 이렇게 Lock을 획득하기 위해 대기하는 Thread들이 많아지고, 대기 시간이 길어지면 Hang 인것처럼 보여지게 됩니다. Java 프로그램에서 Lock을 획득하기 위해서는 Synchronized구문을 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bmCYH2/btsDKRwEsRO/KiG6FhgMaI2zBwOqrJm8lK/img.png)
Widget 클래스 모든 위젯들의 상위 클래스 입니다. 그러나 위젯을 상속받거나 코드에서 바로 사용하면 안됩니다. 하나의 구조로 모든 위젯들을 단일화 하기 위함이기 때문입니다. setData(String Object) : 위젯에 객체를 붙임. 문자열로 접근 가능. getData(String) : 위젯에서 문자열에 대응하는 데이터와 관련된 객체를 반환 getStyle() : 위젯의 스타일에 해당하는 정수를 반환 getDisplay() : 위젯과 관련된 Display 객체를 반환 toString() : 위젯 클래스를 표현하는 문자열 반환 dispose() : 위젯과 위젯 자원에 대한 할당을 해제. isDisposed() : 위젯의 할당을 해제했는지에대한 boolean 값 반환 Control 클래스 Contr..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/B7UzH/btsDFWFndcQ/B8fPbQcgYUWdeVbn6HkEak/img.png)
com.google.zxing 라이브러리 아래는 Zxing Core 3.5.x 버전을 기반으로 한 예제입니다. maven이나 gradle 등을 통해 라이브러리를 프로젝트에 추가할 수 있습니다. 다만 너무 최근 버전보다 안정화된 버전을 사용하는 것을 권장드립니다. 이 zxing 라이브러리는 String을 QR 코드로, 다시 QR코드를 String으로 복원할 수 있습니다. QR 코드 스펙상 문자열의 길이의 제한이 있을 수 있습니다. 인코딩 방식이나 오류 레벨 설정 라이브러리 종류나 버전 등에 따라 차이가 있을 수 있지만 수백 글자에서 수천 자까지만 가능합니다. 따라서 긴 문자열은 QR코드를 여러개로 분할하여 변환해야 합니다. 아래 예제는 긴 문자열을 1000 글자로 나누어서 QR 코드로 변환 후 다시 Str..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bqyqIA/btsDByrTWx0/TERnXht7LwR3QKY2wJEp41/img.png)
모델 기반 어댑터 JFace는 SWT 위젯을 좀 더 쉽게 다룰 수 있도록 헬퍼 클래스들을 지원하는데 이들을 모델 기반 어댑터라고 부릅니다. 어댑터의 종류 뷰어 : 위젯의 모양과 정보를 구별. 가장 많이 사용. 액션과 컨트리뷰션 : 이벤트 처리 절차를 간단하게 만들고 조직화 이미지와 폰트 레지스트리 : 폰트와 이미지의 할당과 해제를 관리 대화상자와 마법사 : 사용자와의 상호작용을 위해 SWT Dialog의 기능을 확장 HelloSWT_JFace 예제 이 예제는 순수 SWT 예제와 비슷하지만 구조가 다릅니다. import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Co..