public class DynamicCompiler {

    public static void main(String[] args) {
        String sourceCode = 
            "public class HelloWorld {" +
            "   public void sayHello() {" +
            "       System.out.println(\"Hello, World!\");" +  // 누락된 세미콜론 추가
            "   }" +
            "}";

        try {
            // 컴파일된 클래스를 메모리에 저장하기 위한 임시 경로
            File tempDir = new File(System.getProperty("java.io.tmpdir"));

            // JavaCompiler API를 사용하여 코드 컴파일
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

            // Java 소스 코드 파일 생성
            File sourceFile = new File(tempDir, "HelloWorld.java");
            System.out.println(sourceFile);
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(sourceFile))) {
                writer.write(sourceCode);
            }

            // 컴파일 옵션 설정
            Iterable<? extends JavaFileObject> compilationUnits = 
                fileManager.getJavaFileObjectsFromFiles(Collections.singletonList(sourceFile));

            // DiagnosticCollector를 사용하여 에러 메시지 수집
            DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
            
            // CompilationTask 생성 시 diagnostics를 전달
            JavaCompiler.CompilationTask task = compiler.getTask(
                null, 
                fileManager, 
                diagnostics, // 에러 메시지 수집기 추가
                null, 
                null, 
                compilationUnits
            );

            // 컴파일 수행
            boolean success = task.call();

            // 컴파일 오류가 발생한 경우, 에러 메시지를 출력
            if (!success) {
                StringBuilder errorMessages = new StringBuilder();
                for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {
                    errorMessages.append("Error on line " + diagnostic.getLineNumber() + ": " + diagnostic.getMessage(null) + "\n");
                }
                System.err.println("Compilation failed:\n" + errorMessages.toString());
                sourceFile.delete();
                return;
            }


            // 컴파일된 클래스 로드
            URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { tempDir.toURI().toURL() });
            Class<?> clazz = classLoader.loadClass("HelloWorld");

            // 클래스 인스턴스 생성 및 메소드 호출
            Object instance = clazz.getDeclaredConstructor().newInstance();
            Method method = clazz.getMethod("sayHello");

            PrintStream orign = System.out;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream ps = new PrintStream(baos);
            System.setOut(ps);  // System.out을 새로운 PrintStream으로 변경

            // 메소드 호출 (콘솔 출력이 ByteArrayOutputStream으로 캡처됨)
            method.invoke(instance);

            // 콘솔 출력된 값을 가져오기
            String consoleOutput = baos.toString().trim();  // trim()을 사용하여 양쪽 공백 제거

            System.setOut(orign);

            // 캡처된 콘솔 출력 값 출력
            System.out.println("Captured Console Output: " + consoleOutput);


            // 임시 파일 정리
            sourceFile.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

'JAVA > Java Study' 카테고리의 다른 글

[Java] 한글 자소분리  (0) 2024.11.08
[Java] Record  (0) 2024.10.30
[GIS] 1. Shp 파일  (1) 2024.09.06
[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Virtual Thread  (0) 2024.06.05

 

한글 검색을 할때 초성만으로 완성된 음절을 사용해야 되는 경우가 있을수 있다. 

다음은 예시 화면이다.

 

 

 

한글 조합형 유니코드표

 

다음에 유니코드 표를 참조하면 아래와 같은 코드를 생성 가능하다

 

public class KoreanDecomposer {

    public static void main(String[] args) {
        String text = "초성테스트";
        for (char ch : text.toCharArray()) {
            System.out.println(decompose(ch));
        }
    }

    public static String decompose(char ch) {
        // 유니코드 상에서 한글 초성, 중성, 종성의 시작 위치
        int baseCode = 0xAC00;
        int choSungBase = 21 * 28;
        int jungSungBase = 28;

        if (ch < baseCode || ch > 0xD7A3) { // 한글 음절 범위 확인
            return String.valueOf(ch); // 한글 음절이 아닐 경우 원문 그대로 반환
        }

        int unicodeIndex = ch - baseCode;

        // 초성, 중성, 종성 분리
        char choSung = (char) (0x1100 + unicodeIndex / choSungBase);
        char jungSung = (char) (0x1161 + (unicodeIndex % choSungBase) / jungSungBase);
        char jongSung = (char) (0x11A7 + unicodeIndex % jungSungBase);

        if (jongSung == 0x11A7) { // 종성이 없을 경우
            return "" + choSung + jungSung;
        } else {
            return "" + choSung + jungSung + jongSung;
        }
    }
}

 

 

결과 페이지이다. 

'JAVA > Java Study' 카테고리의 다른 글

[동적 컴파일] 자바 동적 컴파일러  (0) 2024.12.18
[Java] Record  (0) 2024.10.30
[GIS] 1. Shp 파일  (1) 2024.09.06
[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Virtual Thread  (0) 2024.06.05

기존 자바에서 사용되는 Vo, Dto 등을 대체하기 위해 나온 클래스이다. 

getter를 자동으로 생성되며 불변 객체인것이 특징이다. 

 

대부분 프로젝트에서 사용되는 mybatis등 기능등과 연동이 어려울것으로 보여 과연 사용될지는 .... 

개인 프로젝트에서 불변객체 사용하는 경우에는 대체해볼법 하다. 

 

Record 자세한 내용은 아래에서 참고해볼수 있다.

 

 

 

 

Java 14부터 프리뷰 기능으로 소개된 `Record`는 Java 16에서 정식으로 도입된 데이터 클래스로, 불변 객체를 더욱 쉽게 정의할 수 있도록 설계되었습니다. `Record`를 사용하면 필드 정의와 `getter`, `equals`, `hashCode`, `toString` 메서드를 자동으로 생성하여 개발자의 반복 작업을 줄여줍니다.

다음은 Java 레코드의 특징과 예제를 중심으로 블로그 글의 흐름을 구성할 수 있는 포인트들입니다:

1. Java 레코드 소개 및 필요성
- 레코드 도입 배경**: DTO, VO 같은 간단한 데이터 전달용 클래스는 필드 정의, 생성자, getter, `equals`, `hashCode`, `toString` 메서드를 반복해서 작성해야 하는 번거로움이 있습니다.
- 불변 객체 지원**: 레코드는 기본적으로 불변 객체를 생성하므로 데이터의 무결성을 보장하는 데 유리합니다.

2. 기본 사용법

  public record User(String name, int age) {}


  `record` 키워드를 통해 클래스 이름과 필드를 정의하면, Java는 자동으로 `getter`, `equals`, `hashCode`, `toString` 메서드를 생성합니다.


  User user = new User("Alice", 25);
  System.out.println(user.name()); // "Alice"
  System.out.println(user.age());  // 25




3. 레코드의 주요 특징
- 불변성: 레코드는 기본적으로 모든 필드가 `final`로 지정되어 수정할 수 없습니다.
- 명시적 생성자 추가 가능**: 필요에 따라 특정 로직을 포함한 생성자도 추가할 수 있습니다.
- 메서드 오버라이드**: `toString`, `equals`, `hashCode`는 자동 생성되지만, 필요에 따라 오버라이드할 수 있습니다.
  

  public record User(String name, int age) {
      public User {
          if (age < 0) throw new IllegalArgumentException("Age must be positive");
      }
  }



 4. 레코드의 제한 사항
- 상속 불가: 레코드는 상속이 불가하여 `final` 클래스처럼 동작합니다.
- 필드 제한: 필드는 `static` 또는 `instance`로 선언할 수 없습니다.
  
 5. 레코드와 기존 클래스 비교
- **레코드 vs. 클래스를 통한 데이터 객체**: 레코드를 사용하면 작성해야 할 코드의 양이 줄어들고 코드가 더 간결해집니다.
  
6. 레코드 활용 사례
- 데이터 전송 객체(DTO), 조회 전용 객체, 불변 VO 등 간단한 데이터 보관용 객체에 유용합니다.

 

 

'JAVA > Java Study' 카테고리의 다른 글

[동적 컴파일] 자바 동적 컴파일러  (0) 2024.12.18
[Java] 한글 자소분리  (0) 2024.11.08
[GIS] 1. Shp 파일  (1) 2024.09.06
[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Virtual Thread  (0) 2024.06.05

http://www.gisdeveloper.co.kr/?p=2332

 

대한민국 최신 행정구역(SHP) 다운로드 – GIS Developer

 

www.gisdeveloper.co.kr

 

GIS 작업을 집적 해야 되는 경우가 있다면  Shp 파일이 필요하다.

 

요기 블로그가 년도별 파일이 잘 정리 되어있다. 

 

먼저 국토부 자료를 사용하게되면 먼저 개념적으로 잡고 가야 될 부분이 있다. 

 

법정동과 행정동에 차이를 알아야 한다.

 

행정동과 법정동 차이가 있으며 일반적으로 많이 사용하는 동이 행정동일 것이다. 

 

하지만 .... 국토부 데이터는 법정동 기준이다. 다음 화면을 살펴 보자. 

 

 

 

동을 쪼개서 끝이 아니다..... 쪼개고 합치고 .....

 

 

매년 행정 체계 법정동 체계 바뀔때마다 새로 코드 바꿔야된다....  ㅠ 

 

그나마 1년 단위 체계로 진행이 된다면 조금 나은 편일까... 밑에 주소에서 법정동과 행정동을 변경할수 있는 엑셀을 우선 분석 해야 한다.

 

https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardList.do?bbsId=BBSMSTR_000000000052

 

행정안전부> 업무안내> 차관보> 주민등록,인감> 주민등록,인감

행정안전부 홈페이지에 오신것을 환영합니다.

www.mois.go.kr

 

 

 

 

'JAVA > Java Study' 카테고리의 다른 글

[Java] 한글 자소분리  (0) 2024.11.08
[Java] Record  (0) 2024.10.30
[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Virtual Thread  (0) 2024.06.05
[Java] Object2File 라이브러리 (Fst )  (0) 2024.05.31

 

MVC 모델 1


MVC 모델 1은 뷰와 컨트롤러의 역할이 합쳐져 있다.

흔히 웹 개발을 하면 Jsp가 뷰 역할을 하는데, MVC 1에서 Jsp는 뷰와 컨트롤러의 역할을 모두 감당한다.

 

MVC 모델 1

위와 같이 Jsp가 뷰와 컨트롤러 역할을 모두 수행하면, Jsp에 Java 코드와 Html, css 등의 코드가 섞여 있어, 소스가 복잡해지고 읽기가 어려워져 유지보수가 힘들어 진다.

하지만 상대적으로 설계가 간단하여 개발 속도가 빠르고 작은 프로젝트에 알맞다.

 

 

 

 

MVC 모델 2


MVC 모델 2은 모델 1에서 유지보수가 힘들다는 단점을 보완하기 위해 나온 모델이다.

기존에 뷰와 컨트롤러의 역할을 모두 수행하던 JSP는 뷰의 역할만 하게 하고, 대신 컨트롤러 역할을 Servlet이 수행한다.

모델은 기존 MVC 1 방식과 동일하다.

MVC 모델 2

MVC 1에서는 Jsp가 사용자의 호출을 받아줬는데 MVC 2에서는 컨트롤러 역할을 수행하는 Servlet이 요청을 받아준다. 

Servlet이 비즈니스 로직을 수행하며 모델을 호출하여 데이터를 요청하며, 최종적으로 뷰 역할인 Jsp를 제어하여 화면을 출력한다.

MVC 2로 개발하게 되면 Html과 Java 코드가 분리되어 확장에 용이하고 유지보수가 수월해진다.

Jsp는 Java 코드를 안 쓰는 대신 JSTL을 사용하여 결과 화면을 보여준다.

하지만 초기 설계단계에 비용이 많이 들어 개발 시간이 오래 걸린다는 단점이 있다.

 

'JAVA > Java Study' 카테고리의 다른 글

[Java] Record  (0) 2024.10.30
[GIS] 1. Shp 파일  (1) 2024.09.06
[Java] Virtual Thread  (0) 2024.06.05
[Java] Object2File 라이브러리 (Fst )  (0) 2024.05.31
[HashMap] 해쉬 맵  (0) 2024.02.19

Java21 버전에 Virtual Thread 새로 포함되었다. 

 

기존에 쓰레드 생성 속도및 스위칭 시간이 감소 했다고 한다. 

 

간단한 테스트 정도는 해보았지만 톰캣과 연동등을 통한 밴치마킹을 진행해 봐야겠다.

 

 

 

다음 링크는 해당 내용과 관련된 링크이다. 

 

https://techblog.woowahan.com/15398/

 

https://d2.naver.com/helloworld/1203723

 

https://www.youtube.com/watch?v=BZMZIM-n4C0&t=3729s

 

 

 

 

 

'JAVA > Java Study' 카테고리의 다른 글

[GIS] 1. Shp 파일  (1) 2024.09.06
[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Object2File 라이브러리 (Fst )  (0) 2024.05.31
[HashMap] 해쉬 맵  (0) 2024.02.19
[JAVA] 한글 -> 로마자 변환  (0) 2024.01.19

자바 에서 Object 를 파일로 변환할일이 있다면 반드시 써야 된다고 생각되는 라이브러리다. 

 

 

https://github.com/RuedigerMoeller/fast-serialization

 

GitHub - RuedigerMoeller/fast-serialization: FST: fast java serialization drop in-replacement

FST: fast java serialization drop in-replacement . Contribute to RuedigerMoeller/fast-serialization development by creating an account on GitHub.

github.com

 

 

 

벤치마크 결과 약 10여 배 가량의 속도 차이를 보이고 있다. 

 

데이터 약 160만건 을 기준으로 밴치 마크 해보았다.

 

1. 파일 입력 

  •  자바에서 기본 제공 ObjectInputStream
     용량  :  약 285Mbyte   
     소요시간 : 226 초

 

 

  •  FST 라이브러리  FSTObjectInput
    용량  : 181Mbyte
    소요시간 : 10초 

 

 

2. 파일 출력

  •  자바에서 기본 제공 ObjectInputStream
     소요시간 : 157초

 

 

  • FST 라이브러리  FSTObjectInput
    소요시간  : 14초

 

 

'JAVA > Java Study' 카테고리의 다른 글

[Java] Mvc 패턴 Model1 , Model2  (0) 2024.06.25
[Java] Virtual Thread  (0) 2024.06.05
[HashMap] 해쉬 맵  (0) 2024.02.19
[JAVA] 한글 -> 로마자 변환  (0) 2024.01.19
[Java] Java 한글 라이브러리 hwpxlib  (0) 2023.12.18

https://d2.naver.com/helloworld/831311

'JAVA > Java Study' 카테고리의 다른 글

[Java] Virtual Thread  (0) 2024.06.05
[Java] Object2File 라이브러리 (Fst )  (0) 2024.05.31
[JAVA] 한글 -> 로마자 변환  (0) 2024.01.19
[Java] Java 한글 라이브러리 hwpxlib  (0) 2023.12.18
[Java] Calandar 활용  (0) 2023.11.30

 

https://github.com/crizin/korean-romanizer

 

GitHub - crizin/korean-romanizer: 한국어를 입력하면 로마자로 변환해주는 Java 라이브러리

한국어를 입력하면 로마자로 변환해주는 Java 라이브러리. Contribute to crizin/korean-romanizer development by creating an account on GitHub.

github.com

 

한글 표기를 로마자로 표기로 변경해야 되는 경우가 있다면 해당 라이브러리 참고 해볼만할것 같다.

 

 

홍길동 -> Hong gil dong 
홍길동 -> HKD
서문탁 -> Seo mun tak 
서문탁 -> SMT
황보혜정 -> Hwang bo hye jeong 
황보혜정 -> HBHJ
황보혜정 -> Hwang bo hye jeong 
황보혜정 -> HBHJ

해당 라이브러리 사용하면서 불편한점이 있어 일부 변경 적용하였다. 

 

1. 영문 글자들이 붙어 있는 경우 각 음절과 관련하여 재 분리 해야 되는경우 불편해 적용하였다. 

   ex ) Seomuntak  -> Seo mun tak  

 

 만약 띄어쓰기가 필요 없는경우 replace 함수를 통해 합치는건 쉽지만

 뛰어쓰기 및 - 문자등으로 분할되어 있지 않다면 다시 분리하기가 어렵기 때문이다. 

 

2. Type 이니셜 추가 하여 한글 이니셜 기능을 추가하였다. 

 

public class KoreanTest {
    public static void main(String[] args) {

        String word;
        word = "홍길동";
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.NameTypical));
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.Initial));

        word = "서문탁";
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.NameTypical));
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.Initial));

        word = "황보혜정";
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.NameTypical));
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.Initial));

        word = "황보혜정";
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.NameTypical));
        System.out.println(word+" -> "+KoreanRomanizer.romanize(word, KoreanCharacter.Type.Initial));

    }
}

사용법에 대한 샘플 예제 이다.

 

홍길동 -> Hong gil dong 
홍길동 -> HKD
서문탁 -> Seo mun tak 
서문탁 -> SMT
황보혜정 -> Hwang bo hye jeong 
황보혜정 -> HBHJ
황보혜정 -> Hwang bo hye jeong 
황보혜정 -> HBHJ

 

밑에는 압축 파일은 변경 적용한 소스 파일이다. 

Korean2Roman.zip
0.01MB

 

'JAVA > Java Study' 카테고리의 다른 글

[Java] Object2File 라이브러리 (Fst )  (0) 2024.05.31
[HashMap] 해쉬 맵  (0) 2024.02.19
[Java] Java 한글 라이브러리 hwpxlib  (0) 2023.12.18
[Java] Calandar 활용  (0) 2023.11.30
[Java] 공휴일 구하기  (0) 2023.11.30

https://github.com/neolord0/hwpxlib

 

GitHub - neolord0/hwpxlib: hwpx library for java

hwpx library for java. Contribute to neolord0/hwpxlib development by creating an account on GitHub.

github.com

 

깃허브에 공개된 자바 한글 라이브러리로 excel poi 등처럼 사용이 가능하다. 

 

개인 개발자가 한글에서 공개한 문서를 기반으로 바이트 코드 분석 으로 객체화 시켜 두었다. 

 

아직은 현재 라이브러리안에 depth 파악이 어려운등에 문제가 있으나

 

html 돔 paresr와 비슷한 개념의 parser등을 만들어 사용한다면 좋은 방향이 되지 않을까 한다. 

 

샘플로 해당 라이브러리 몇몇 만들고 있으나 사용법이 만만치는 않다 ㅠ

'JAVA > Java Study' 카테고리의 다른 글

[HashMap] 해쉬 맵  (0) 2024.02.19
[JAVA] 한글 -> 로마자 변환  (0) 2024.01.19
[Java] Calandar 활용  (0) 2023.11.30
[Java] 공휴일 구하기  (0) 2023.11.30
[Java] Oracle 타입별 매핑표  (1) 2023.11.28

+ Recent posts