목록Java (88)
삶 가운데 남긴 기록 AACII.TISTORY.COM
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..
Spring 개발을 위해 STS를 다운로드 후 압축을 풀다가 파일 경로가 260자 이상 제한에 걸려서 압축 풀기에 실패했습니다. 반디집 설정에도 260자 넘어도 압축이 풀리도록 설정되어 있는데도 실패했죠. 반디집은 환경설정 > 기타 항목에 있습니다. Windows 10 1607 버전부터는 NTFS 파일시스템에서 길이 제한을 늘릴 수 있습니다. 1. 윈도우 키 + R 키를 눌러서 gpedit.msc 를 입력해서 그룹 정책 편집기를 실행합니다. 2. 컴퓨터 구성 -> 관리 템플릿 -> 시스템 -> 파일 시스템 경로를 찾아 갑니다. 3. "Win32 긴 경로 사용"을 선택해 사용 상태로 바꿔줍니다. 4. cmd 명령 프롬프트를 열고 gpupdate 를 실행해서 그룹 정책을 업데이트 합니다. 그러면 STS 압축..
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)..
이번에는 재귀 호출을 이용하여 특정 폴더의 내용을 모두 삭제하는 예제를 구현해봤습니다. 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); //..
자바에서 String을 치환할 때 보통 replace()와 replaceAll()을 사용합니다. 결론부터 말하자면 replaceAll()은 정규식이 올 수 있다는 것이 차이입니다. 일반적인 문자열을 치환할 때 속도가 빠른 replace() 사용하고 보다 복잡한 치환을 할 때는 정규식을 지원하는 replaceAll()을 사용합니다. 아래 예제에서 보면 replaceAll()은 . 이나 대괄호가 있으면 정규식으로 인식하여 replace()와 다른 결과가 나온다는 것을 알 수 있습니다. package test; public class ReplaceTest { public static void main(String[] args) { String sampleText = "co.kr//123-abcd//[/]-aa..
Bcrypt 사용 예 maven이나 gradle로 관련 라이브러리를 추가 후 아래와 같이 사용합니다. String pw = "pw1234!"; //실제 데이터베이스에 저장될 패스워드의 해시값 String hashed = BCrypt.hashpw(pw, BCrypt.gensalt()); //입력된 패스워드와 해시되어 저장된 패스워드를 비교 boolean isValid = BCrypt.checkpw(pw, hashed); salt 해시된 패스워드를 저장한 테이블인 Rainbow Table 을 이용한 해킹 공격을 막기 위하여 랜덤 생성한 salt값을 더한 뒤 다시한 번 해시 값을 얻어서 Rainbow Table 을 이용한 공격을 막습니다. Bcrypt 해시 값의 예 $2a$10$vI8aWBnW3fID.ZQ4/..
JAVA application Export runnable jar 자바 어플리케이션을 실행가능한 jar 파일로 만들 때 manifest 파일(MANIFEST.MF)에 메인 클래스를 지정해줘야 합니다. https://iloveaired.tistory.com/entry/Jar-manifest-%ED%8C%8C%EC%9D%BC-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0 Jar manifest 파일 등록하기 예) Manifest-Version: 1.0 Main-Class: XXXXX iloveaired.tistory.com https://m.blog.naver.com/eungsik80/220054805497 jar 파일 생성 시 MANIFEST.MF 작성 jar 파일 생성 시 MANIFE..
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..
정수 오버플로우 java 에서 허용한 큰 정수 값보다 더 커지면 의도하지 않게 작은 수 이거나 음수가 될 수 있습니다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용합니다. 안전하지 않은 예 //생략 int size = new Integer(args[0]).intValue(); size += new Integer(args[1]).intValue(); MyClass[] data = new MyClass[size]; //생략 배열의 값이 오버플로우되어 음수가 되면 배열의 크기가 음수가 되어 문제가 생길 수 있습니다. 동적 메모리 할당을 위해 배열의 크기를 사용하는 경우 그 값이 음수인지 아닌지 검사하는 문장이 필요합니다. 안전한 코드의 예 //생략 int size = new Int..
HTTP Response Splitting(HTTP 응답 분할) HTTP request에 들어있는 인자값이 HTTP response header에 포함되어 사용자에게 다시 전달 될 때, 입력값에 CR(캐리지리턴), LF(라인피드)같은 줄바꿈 문자가 존재하면 response가 2개 이상으로 분리될 수 있는데, 공격자가 첫번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입해서 XSS 및 캐시를 훼손하는 공격 등을 할 수 있습니다. 외부 입력값을 HTTP response의 응답 헤더(Set Cookie 등)에 포함시킬 경우 CR, LF를 제거하거하거나 오작동을 일으킬만한 소지가 있는 문자들을 제거하여 방어합니다. 안전하지 않은 예 //생략 response.setContentType("text/html..
Cross-Site Request Forgery 사용자가 인지하지 못한 상황에서 사용자 의도와는 무관한 공격자의 행위를 요청하게 하는 공격을 말합니다. 사용자의 세션이 특정 동작을 수행해도 계속 유지되어 정상요청과 비정상요청을 구분하지 못하는 점을 악용합니다. GET방식은 URL에 추가적인 정보를 덧붙일 수 있으므로 CSRF 공격에 노출 될 수 있습니다. 입력 폼(form) 작성시 GET보다는 POST로 전달하고 입력 폼과 서버측 프로그램 사이에 토큰을 사용하여 공격자의 직접적인 URL 사용이 동작하지 않도록 처리하여 방어합니다. 중요한 기능은 세션검증과 재인증을 유도합니다. 안전하지 않은 예 ... ... ... post를 사용하여 방어 ... ... ... 참고 http://cwe.mitre.org/..