[JAVA-Spring] Lombok 동작 원리
2022. 8. 17. 17:54
Back-End/Java & Spring
Lombok Lombok 동작 순서 javac 가 프로그래밍 언어로 작성 된 소스 코드를 파싱하여 AST 를 만듭니다. Lombok 의 AnnotationProcessor 가 컴파일중 AST를 수정 및 추가 생성 합니다. javac 는 AnnotationProcessor에 의해 수정된 AST를 기반으로 class 파일을 생성합니다. AST ( abstract syntax tree, 추상 구문 트리 ) 프로그래밍 언어로 작성된 소스 코드를 컴파일러가 각각 의미별로 분류하여 컴퓨터가 이해할 수 있게 "abstract syntax" 구조로 만들어낸 중간 결과물 입니다. abstract syntax : 프로그래밍 언어의 문법 규칙 ex JAVA) public String methodName( String str..
[JAVA] 특정 클래스를 상속받은 모든 클래스를 찾는 방법
2022. 8. 17. 15:17
Back-End/Java & Spring
로직을 구현하던 중 특정 클래스 파일 목록을 뿌려줘야 하는 기능이 필요하여 기존엔 특정 Package 안에 있는 클래스 파일을 가져오는 방식으로 구현하였었는데 모든 Class를 가져오기 때문에 보안에 취약할 수도 있고, 프로젝트 패키지의 구조가 바뀌거나, 원치 않는 클래스 파일이 지정해줬던 Package 안에 생성될 경우 Exception 이 날 수 있어서 다른 방법을 고안하였습니다. interface 를 하나 만들어서 해당 interface를 상속받은 클래스를 가져오는 방식으로 구현하여서 위의 문제점을 해결하였는데 꽤나 유용한 것 같아서 두가지 방법을 작성해보고자 합니다. 우선 아래와 같은 interface와 구현체가 존재한다고 가정합니다. interface print 인터페이스를 구현한 클래스를 가져..
[JAVA] 제네릭 표현
2022. 8. 17. 14:10
Back-End/Java & Spring
제네릭 제네릭은 클래스나 메서드에서 사용할 데이터 타입을 컴파일 과정에서 미리 지정하는 방법입니다. 컴파일 시에 미리 타입 검사를 수행함을 통해 러닝 과정에서 오류를 사전에 방지할 수 있습니다. 보통 대표적인 제네릭 사용으로 List list = new ArrayList(); 등을 알고 있을탠데 여기선 , , 등에 대해 알아보고자 합니다. : raw type Element를 받을 때 Object에 포함되는 모든 클래스를 받을 수 있습니다. 가장 유연성이 높지만 컴파일 과정에서 타입 체크가 불가능하여 러닝중 오류가 발생할 확률이 높기 때문에 구현 과정에서 신중할 필요가 있고, 가급적 사용하지 않는 것이 좋습니다. : 타입 변수 이나 등으로 지정할 경우 해당 블럭 내에선 지정한..
[JAVA-Spring] 가변적인 Parameter 처리
2022. 8. 2. 19:34
Back-End/Java & Spring
웹에서 보낸 Request Parameter를 Controller 에서 처리해야 하는데 같은 로직에 다양한 VO / DTO 를 넣어줘야 할 경우가 있다. VO/DTO 마다 Controller를 새로 구현하여 데이터를 수신받는 것은 중복된 코드가 많아지고 유지보수도 귀찮아진다. 필드상에 VO/DTO를 선언하지 않고 하나의 Controller 에서 데이터를 수신할 수 있는 방법 2가지와 수신받은 데이터를 VO / DTO에 매핑시킬 수 있게 ObjectMapper 라이브러리를 사용한 방식에 대해 작성하였다. 매핑시킬 VO @Data public class Person { private int age; private String name; private String birth; } 서버로 데이터 전송 모..
[JAVA] Log4j
2022. 8. 2. 19:28
Back-End/Java & Spring
Logging Logging은 프로그램 실행 중 정보(성공, 실패, 시간, 횟수 등)를 기록하는 행위로 System.out.println() 또한 logging의 일종이다. System.out.println() 대부분의 개발자들은 로그를 찍기 위해 System.out.println() 메서드를 사용한 시스템 로그를 많이 사용한다. 이 방법은 가장 간단하고 쉽긴 하지만 서비스 운영중엔 확인이 어렵고 성능에 영향도 많이 준다. 파일이나 콘솔에 로그를 남길 경우 내용이 완전히 프린트되거나 저장될 때까지, 이후 프린트하려는 작업은 대기할 수 밖에 없다. 이 대기 시간은 또한 시스템의 성능에 의존하게 된다. 더 큰 문제는 보통 개발을 하는 사람과 서비스를 운영하는 사람은 다르기 때문에 System.out.pr..
[JAVA] JNDI( Java Naming and Directory Interface )
2022. 8. 2. 19:21
Back-End/Java & Spring
JNDI( Java Naming and Directory Interface ) 정의 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견( discover ) 하고 참고( lookup ) 하기 위한 자바 API 목적 데이터베이스 커넥션을 자바 웹 애플리케이션이 아닌 WAS에서 데이터베이스 커넥션을 생성하고 풀로 관리하기 위함 WAS 의 설정파일 안에 JNDI 를 입력해놓으면 웹 애플리케이션은 JNDI 만 호출하면 DB 접속이 가능하다. 사용이유 개발을 하는 사람과 실제 서비스를 운영하는 사람은 다른 경우가 많기 때문에 소스 레벨에서 하드코딩 되어있는 것 보단 WAS에서 설정되어 있는 것을 선호한다. 보통 WAS에 서버를 여러개 생성해서 웹 애플리케이션을 배포하기 때문에 WAS 안에서 한번에 설정해주는 것이..
[JAVA] Apach Axiom API (XML Parser)
2022. 8. 2. 19:15
Back-End/Java & Spring
Apach Axiom VS Java DOM 성능 비교 JAVA 의 xml parser 중 하나 구조 JDOM 전체 파일을 읽어와서 Tree 형식으로 구조화해서 메모리에 올려놓기 때문에 메모리 관리 면에서 불리 한번 파싱하면 계속 조회/수정이 가능한 장점이 있음 AXIOM Tree 구조가 아닌 StAX API 를 기반으로 직접 접근하는 방식으로 메모리 관리에서 유리 조회/수정이 필요할 때 마다 계속 파싱해야하는 단점이 있음 성능 비교 ( y축 : 처리량 / x축 : 문서 크기 ) 테스트1 : 문서 전체를 파싱 문서 전체를 파싱하는건 Axiom 장점중 하나인 원하는 Element 만 파싱할 수 있다는 점을 발휘하지 못한다. 테스트2 : 각 용량별 XML 파일에서 67개의 Element 만 파싱 XML 파일..
[JAVA] JVM 메모리 구조와 라이프 사이클
2022. 8. 2. 19:10
Back-End/Java & Spring
JVM 메모리 구조와 라이프 사이클 JVM (Java Virtual Machtine) JAVA와 OS 사이에서 중개자 역할 OS에 구애 받지 않고 프로그램을 실행하도록 도와준다. 가비지 컬렉터를 통해 자동으로 메모리 관리 스택VM 기반으로 동작 JVM 메모리 구조 1) Class Loader JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈 런타임 시에 동적으로 클래스를 로드한다. 2) Execution Engine 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. 3) Garbage Collector 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체를 탐색 후 제거하는 역할 GC가 역할을 하는..
[JAVA] Java Framework 종류
2022. 8. 2. 17:49
Back-End/Java & Spring
웹 프레임워크 Struts Framework 사용자가 요청하면 struts.xml 설정에 따라 액션으로 매핑시켜준다. 액션에서 로직 수행 후 결과를 request객체에 담고 리턴받은 포워드로 jsp를 연결시켜준다. Jsp페이지로 직접 url호출이 불가능하도록 설정 Grails Apache Groovy언어를 사용하며 JDK와 java언어를 기반으로 JVM에서 실행된다. Spring Boot, Hibernate, Quartz기반 JVM을 위한 웹 어플리케이션 프레임워크 Google Web Toolkit 자바스크립트 프론트엔드 애플리케이션을 자바로 만들고 관리할 수 있게 해주는 프레임워크 Java로 개발하면 GWT에서 제공하는 Java-to-Javascript로 컴파일하여 코드를 변환시켜준다. Va..
[JAVA] Collection Framework 정의/성능 비교
2022. 8. 2. 17:45
Back-End/Java & Spring
Java Collection Framework Collection 인터페이스 그룹 Collecton 인터페이스 직접적인 구현은 제공하지 않는다. 모든 컬렉션 클래스가 구현해야 하는 메서드들을 포함하고 있다. (add, remove, equals 등) Set 인터페이스 순서를 유지하지 않는다. 데이터의 중복을 허용하지 않는다. 종류 HashSet 가장 빠른 임의 접근 속도를 갖고 있다. 순서를 예측할 수 없다. TreeSet 정렬 방법을 지정할 수 있다 기본적으로 오름차순으로 데이터를 정렬한다. LinkedHashSet 예외적으로 입력된 순서대로 데이터를 저장한다. 출력 시 입력된 순서로 데이터를 가져온다. y축 : 시간/데이터 갯수 ( ns ) x축 : 데이터 삽입/조회 수 3) SortedSet..