java 12

[Java] XML Parsing 방식(DOM, SAX 방식)

최근에 대용량 데이터 처리에 대한 업무 개선을 위해,외부에서 받아서 처리하는 XML 데이터의 파싱 방식을 변경하는 작업을 진행했다.XML 데이터를 파싱하는 대표적인 방식으로 DOM 방식과 SAX 방식이 있는데,각각의 장단점과 방식을 변경한 이유에 대해 설명해보겠다. 1) XML 파싱(XML Parsing)1-1) XML Parsing? : XML(eXtensible Markup Language)은 데이터를 저장하고 전송하기 위한 표준화된 형식이고, XML 파싱은 이러한 XML 문서를 읽고 그 구조와 내용을 프로그램에서 사용할 수 있는 형태로 변환하는 과정이다.1-2) XML 문서의 구조 : XML 문서의 구조를 아래 예시를 통해 알아보자.XML 문서 예시 귤 과일 ..

Java/Java 2025.04.18

[Java] javax.servlet import 에러 해결 방법

HttpServlet을 사용하기 위해 관련 패키지를 import하려고 하는데, 오류가 발생하였다.오류가 발생하는 이유는 이클립스 내 해당 프로젝트에 Server 라이브러리가 설정되어있지 않기 때문인데,이 오류를 해결하는 방법에 대해 알아보자.개발환경JDK: Java 1.8서버: Tomcat 9.0IDE: IntelliJ 먼저, 아래 이미지를 참고하여 프로젝트 우클릭 > Properties 를 선택한다. Java Build Path를 클릭하고, Add Library를 클릭한다. 서버 라이브러리를 추가해야하기 때문에, Server Runtime을 클릭한다. 각자 프로젝트 환경에 맞는 서버를 선택하고, Finish를 클릭한다. 위 과정을 거치면, 서버 라이브러리가 정상적으로 Build Path에 추가된 ..

[Spring/MyBatis] 페이징 처리, Pagination 구현하기

API를 개발할 때, 페이징처리는 서버의 부하를 위해 꼭 필요한 기능이다.Spring에서 제공하는 Pageable을 활용하여 페이징 처리(페이지네이션)를 하는 방법에 대해 알아보자. 1) Pagination(페이지네이션): 데이터를 정렬기준, 페이지 크기, 몇 번째 페이지인지를   토대로 정보를 전달해주는 것1-1) Pageable Interface: Spring에서 페이징 처리를 하기 위해서 사용하는 인터페이스이다.객체를 생성할 때는 구현체인 PageRequest 를 사용하는데,PageRequest 생성자를 보면 page, size, sort 가 있다.[ PageRequset.class ]API를 호출할 때, 몇 번째 페이지인지에 대한 정보(page)와한 페이지당 보여줄 데이터의 개수(size)를 함께..

[Spring Data JPA] JPA 기본 Annotation 정리

Spring JPA에서 객체를 entity로 사용하기 위해 @Entity 어노테이션을 사용해야한다.이처럼 JPA를 사용할 때 필요한 Annotation에 대해 몇 가지 알아보자.  아래의 Member Entity를 예시로 들어보자.1) @Entity: entity 어노테이션은 DB 테이블과 1:1로 매칭되는 객체로, entity 객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미한다.따라서 각 레코드를 구분하기 위한 유일한 키값을 가지는데, 이것이 테이블의 PK(Primary Key)와 같은 의미를 가지며, @Id 어노테이션으로 정의한다. 2) @GeneratedValue: PK 자동 생성 전략을 설정하는 어노테이션으로, 4가지가 있다.@GeneratedValue(strategy = {기본키값 생..

[Spring] Spring Security + Swagger 적용 401 에러 해결

Swagger는 REST API를 설계, 빌드, 문서화 및 사용하는 데 도움이되는 OpenAPI 사양을 중심으로 구축 된 오픈 소스 도구 세트이다.이번에 신규 서비스를 개발하게 되면서, API를 간편하게 문서화하기 위해 프로젝트 Gradle에 Swagger를 적용하였다.Swagger 적용으로 개발할 때도 Postman을 별도로 사용하지 않고 바로 테스트가 가능하여 굉장히 편리하다는 생각이 들었다.하지만 이후에 인증 기능을 추가하게 되면서 Swagger 페이지가 갑자기 열리지 않는 상황이 발생하였다.이 문제를 해결하는 과정에 대해서 알아보자. 개발환경언어: Java버전: Java 17프레임워크: Spring Boot 3IDE: IntelliJ빌드: Gradle 1) 문제파악Swagger를 잘 사용하던 중에..

[Java] printStackTrace 취약점

intelliJ 환경에서 Java Spring 개발을 하던 중, e.printStackTrace() 구문을 사용한라인에서 warning 표시가 나오는 것을 보았다.코드를 지우면서 문득 왜 사용을 지양해야하는지 궁금해져서 찾아보게 되었다.  1) printStackTrace란?: printStackTrace() 는 예외발생 당시의 호출스택(Call Stack)에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.위의 코드는 실제 printStackTrace() 함수의 내부 구현인데,System.err를 PrintStream으로 사용하고 있다.그리고 이 함수 내부를 타고 가다가 보면 StackTraceElement.of 를 통해 StackElement를 가져온다.이 of 메소드 내부를 또 살펴보게 되면 ..

Java/Java 2025.03.17

[Java/Spring] MyBatis typeAlias 사용법

Java로 서버개발을 할 때 MyBatis를 자주 사용하게 될 것이다.이 때 MyBatis의 typeAlias 라는 것을 사용할 수가 있는데,Alias는 "별칭" 이라는 의미로 사용자가 직접 정의하는 이름(별명)을 붙여주는 것이다.MyBatis를 사용하여 데이터를 처리할 때, 일반적으로 결과 데이터와 매핑되는 Java 클래스를 생성하게 된다.이 때 해당 Java 클래스의 Alias를 지정하여 사용하는 방법에 대해 알아보자. 1) typeAlias란: MyBatis를 이용하여 DB의 데이터를 받아 자바의 VO 객체에 담거나,반대로 자바 VO 객체의 데이터를 DB에 전송하는 과정에서보다 간결하게 코드를 작성하기 위해 사용하는 것이다.클래스의 경로를 별칭을 사용하여 정의해두고,이 별칭을 클래스 경로 대신 활용..

[Java] 추상 클래스(Abstract Class)란?

객체 지향 프로그래밍의 특징 중, 추상화(Abstration)에 대한 내용이 있다. 추상화의 핵심 개념은 "공통성과 본질을 모아서 추출"한다는 것인데, 추상 클래스가 무엇인지, 왜 사용하는지에 대한 내용을 알아보면서 객체 지향 프로그래밍의 추상화에 대한 개념도 함께 이해해보자.1. 추상 클래스란?: 추상 클래스(Abstract Class)는 클래스들의 공통되는 필드와 메소드를 정의한 클래스를 말한다.추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성할 수 있게 된다.1-1. 추상 클래스 선언 예시public abstract class Player { ... }1-2. 추상 메소드 선언 예시public abstract void walk(); 2. 추상 클래스의 특징추상 클래스 내부에 추상..

Java/Java 2025.03.14

[Java] compareTo 함수

자바의 compareTo 라는 함수는 두 개의 값을 비교하여 int 값으로 반환해주는 함수이다.이 함수는 "문자열의 비교" 또는 "숫자의 비교" 두 방식이 존재하는데, 이 각각의 경우에 대해 알아보자. 1) 숫자형 비교: 숫자형 비교는 Byte, Double, Integer, Float, Long 또는 Short 등을 비교할 수 있다.반환되는 값은 아래 규칙을 따른다.기준 값과 비교대상이 동일한 값일 경우: 0기준 값이 비교대상 보다 작은 경우: -1기준 값이 비교대상 보다 큰 경우: 1 2) 숫자형 비교 예시Integer x = 7;Integer y = 4;Double a = 1.5;Double b = 1.75;System.out.println(x.compareTo(y));System.out.print..

Java/Java 2025.03.14

[Java] replace, replaceAll 함수

자바의 String 관련 함수 중, 특정 문자열을 원하는 문자열로 치환하는 함수인 replace, replaceAll 함수가 있다.이 두 가지 함수의 공통점과 차이점에 대해 알아보자. 1) replace()문법: String replace(CharSequence target, CharSequence replacement) 2) replaceAll()문법: String replaceAll(String regex, String replacement) 3) replace, replaceAll 함수 차이점: 가장 큰 차이점은 "입력 인자값의 형"에 있다.replace()는 CharSequence 이고 replaceAll()는 String 인자를 사용할 수 있다.String 을 사용할 수 있다는 것의 의미는, 정..

Java/Java 2025.03.14