목록자바 (91)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Visitor 패턴개요 및 장점Visitor 패턴은 형태가 거의 변경되지 않는 객체(데이터 구조)에서 처리 로직이 자주 변경되는 경우, 객체들의 구조와 알고리즘을 분리하여 적용할 수 있게 해 줍니다. 이 패턴은 객체의 클래스에서 알고리즘을 분리하여 새로운 알고리즘을 추가하거나 수정할 때 기존 코드를 수정하지 않고도 가능하게 합니다. Visitor 패턴은 새로운 기능을 추가하기 위해 기존 객체 구조를 변경할 필요 없이 새로운 방문자 클래스를 추가하면 됩니다.객체 구조에 대한 다양한 작업을 별도의 방문자 클래스로 분리하여 객체 구조와 방문자 클래스 사이의 결합도를 낮춰 코드 유지 관리를 용이하게 합니다. Visitor 패턴의 활용컴파일러: 소스 코드를 분석하고 변환하는 과정에서 방문자 패턴을 사용하여 각 문..
MyBatisMybatis는 내부적으로 JDBC를 이용해서 preparedStatement 실행시키는 방식으로 구동되는 프레임워크입니다.매퍼 xml 파일에 SQL문을 작성하고 관리하기 때문에 자바 소스에서 SQL문을 작성할 필요가 없어서 SQL을 수정했을 때 프로젝트를 다시 빌드를 할 필요가 없습니다.리소스 생성과 해제, try-catch 등 JDBC를 사용할 때의 반복 작업을 줄여줍니다.SQL를 직접 작성하기 때문에 ORM(JPA) 방식보다 SQL쿼리를 튜닝하는 등 복잡한 쿼리를 다룰 때 더 적합합니다. MyBatis 구조설정 파일(mybatis-config.xml): 데이터 베이스 설정과 트랜잭션 등 동작 규칙을 정의하는 파일입니다.매퍼 xml 파일: SQL 구문을 정의하고 namespace와 id..
popup은 차단이 기본 값popup은 보안 문제가 있어서 대부분의 브라우저에서 차단하는 것이 기본 값으로 되어있습니다.그렇지만 web application을 만들다 보면 popup 기능이 필요할 때가 있습니다.popup 윈도우의 대안으로 iframe, modal, overlay 등을 생각해 볼 수 있습니다. IFRAMEiframe의 경우에도 popup고 마찬가지로 보안 문제 때문에, 정책상으로 https으로만 접근이 가능하도록 하는 것이 일반적입니다.https으로 서버를 구축하려면 CA(인증 기관)으로부터 발급된 SSL 인증서가 필요합니다. 인터넷과 단절된 폐쇄된 내부 인트라넷 환경에서 HTTPS를 사용할 때는 내부 CA와 자체 서명 인증서를 이용해서 https를 구축할 수 있습니다.내부 CA(인증 ..
자바로 파일을 다루다 보면 파일 이름으로 금지된 문자들을 걸러낼 필요가 있습니다. 그래서 만들어 봤습니다. 제가 쓰려고요. //파일명으로 금지된 문자들을 검사 public static boolean isContainsForbiddenChar(String input) { // 금지된 문자들 배열 char[] forbiddenChars = { '/', '\\', '*', '"', '', '|' }; // 입력 문자열에 금지된 문자가 포함되어 있는지 검사 for (char forbiddenChar : forbiddenChars) { if (input.contains(String.valueOf(forbiddenChar))) { return true; } } // 금지된 문자가 없는 경우 return false;..
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구문을 ..
com.google.zxing 라이브러리 아래는 Zxing Core 3.5.x 버전을 기반으로 한 예제입니다. maven이나 gradle 등을 통해 라이브러리를 프로젝트에 추가할 수 있습니다. 다만 너무 최근 버전보다 안정화된 버전을 사용하는 것을 권장드립니다. 이 zxing 라이브러리는 String을 QR 코드로, 다시 QR코드를 String으로 복원할 수 있습니다. QR 코드 스펙상 문자열의 길이의 제한이 있을 수 있습니다. 인코딩 방식이나 오류 레벨 설정 라이브러리 종류나 버전 등에 따라 차이가 있을 수 있지만 수백 글자에서 수천 자까지만 가능합니다. 따라서 긴 문자열은 QR코드를 여러개로 분할하여 변환해야 합니다. 아래 예제는 긴 문자열을 1000 글자로 나누어서 QR 코드로 변환 후 다시 Str..
classpath 경로 지정 JVM이 클래스 파일을 찾는 경로를 지정할 수 있습니다. java -cp /path/to/classes com.example.MyApp 힙 메모리의 최대/최소 용량 지정 객체들이 저장되는 메모리 영역인 힙 메모리의 최대/최소 크기를 지정해줄 수 있습니다. application 성격상 알맞게 조절 할 수 있죠. java -Xmx512m -Xms256m com.example.MyApp 시스템 프로퍼티 설정 시스템에서 전역적으로 사용하는 값들을 지정할 수 있습니다. 자바의 System 클래스의 getProperty()메소드를 이용해서 그 값들을 받을 수 있습니다. java.version, os.name, path.separator 같은 것들이 대표적인 시스템 프로퍼티입니다. jav..
자바 application에서 파일을 저장할 때 절대경로는 보통 사용하지 않고 상대경로를 사용합니다. System.property("user.dir")을 통해 현재 application이 실행되는 작업 디렉토리를 얻고 그 기반으로 생성되는 파일의 경로를 지정합니다. File.separator는 파일 경로를 생성 할 때 운영체제에 맞는 파일의 구분자를 자동으로 선택해 줍니다. public class DynamicFilePathExample { public static void main(String[] args) { // 현재 작업 디렉토리 확인 String currentDir = System.getProperty("user.dir"); // 파일 저장 경로 설정 (현재 작업 디렉토리 내의 example.t..
application 실행시 arguments 지정 방법 메뉴 바에서 "Run" 또는 "Debug"을 선택한 후, "Edit Configurations"을 선택합니다. 원하는 구성(예: Application)을 선택하고, "Configuration" 탭에서 "Program arguments" 섹션에 인수를 입력합니다. "Run/Debug Configurations" 대화 상자에서 "Program arguments" 필드에 직접 값을 입력할 수 있습니다 "Run/Debug Configurations" 대화 상자에서 "Environment variables" 섹션을 통해 환경 변수를 설정할 수 있습니다. Runnable JAR 파일로 export 방법 1. 프로젝트 설정 확인: 프로젝트가 메이븐(Maven)..
세상에는 여러 시스템이 있고 한글 인코딩 방식은 많습니다. 개발자에게 한글 인코딩 문제는 생각보다 자주 마주치는 문제입니다. 자바 애플리케이션이 실행되는 런타임 환경에서 인코딩을 지정할 수 있는 옵션이 있었으니... 바로 -Dfile.encoding=utf-8 되시겠습니다. 애플리케이션 실행 시 아래와 같이 옵션을 추가해주시면 자바 런타임 인코딩 방식이 지정됩니다. java -Dfile.encoding -jar example.jar args0, args1, ... WAS인 tomcat도 실행시 자바 런타임에서 실행되기 때문에 tomcat의 start 스크립트에도 인코딩 옵션을 추가할 수 있습니다. 운영체제 기본 인코딩과 무관하게 JVM을 통해 실행시 옵션으로 인코딩을 지정하기 때문에 편리합니다. 다음은 ..
이번에는 재귀 호출을 이용하여 특정 폴더의 내용을 모두 삭제하는 예제를 구현해봤습니다. import java.io.File; public class DeleteDirectoryExample { public static void main(String[] args) { String directoryPath = "C:/Temp"; // 윈도우 실행 기준 File directory = new File(directoryPath); // 디렉토리가 존재하면 삭제 수행 if (directory.exists()) { deleteDirectory(directory); System.out.println("디렉토리 및 하위 경로가 삭제되었습니다."); } else { System.out.println("디렉토리가 존재하지 ..
자바로 텍스트 파일을 생성해서 자장할 때 FileWriter(arg1, arg2) 메서드의 arg2 두번째 인수가 false냐 true냐에 따라 기존 파일을 overwrite할지 append 할지 결정 할 수있습니다. import java.io.FileWriter; import java.io.IOException; public class FileWriterExample { public static void main(String[] args) { // 파일 경로 및 파일명 설정(윈도우 기준) String filePath = "C:/예제 파일이름.txt"; try { // FileWriter 객체 생성 //두 번째 매개변수로 false를 전달하면 기존 파일이 있으면 내용을 덮어씀(overwrite) //tr..
날짜 및 시간을 지정한 형식 yyyyMMddHHmmss( 년도월일시분초)으로 출력하는 예제 입니다. import java.text.SimpleDateFormat; import java.util.Date; public class CurrentDateTimeExample { public static void main(String[] args) { // 현재 날짜 및 시간 가져오기 Date currentDate = new Date(); // 원하는 형식으로 날짜 및 시간 포맷팅 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String formattedDateTime = dateFormat.format(currentDate); //..
1. 인코딩(Encoding) 1.1. 파일 및 문자 인코딩은 UTF-8 (gerneral_ci)으로 통일한다. 2. 이름(Naming) 2.1. 변수명, 클래스명, 인터페이스명, 메서드명에는 영어와 숫자만 사용한다. public interface AutoClosable{ 2.2. 변수명, 클래스명, 인터페이스명, 메서드명 단어 합성시에는 낙타 등 표기법으로 한다. public interface RowMapper{ 2.3. 클래스명, 인터페이스명, 생성자명은 대문자로 시작한다. public class WatcherClass{ 2.4. 변수명과 메서드명은 소문자로 시작해야한다. public String setHtmlName(String mode){ 2.5. 상수명은 모두 대문자로 하고 단어를 합성할 때는 ..
java.util.concurrent.TimeUnit 패키지 TimeUnit은 멀티 Thread가 아닌 메서드에서 시간을 지연 시킬 때 사용합니다. 예제 import java.util.concurrent.TimeUnit; public class SimpleTest { public static void main(String[] args) { try { for (int i = 0; i < 3; i++) { TimeUnit.SECONDS.sleep(2); System.out.println("Sleep "+i+" sec"); } }catch(Exception e) { System.out.println(e); } } } 자세한 api 문서는 아래 참고 https://docs.oracle.com/javase/7/d..
