JAVA 18

Itextpdf를 이용한 html 파일 PDF 변환 및 암호설정

최근 pdf 파일을 암호설정 후 이메일로 전송해주는 기능을 구현하는 업무를 하게 되었는데, 먼저 pdf 파일을 암호 설정하는 방법을 정리하는 글을 쓴 뒤 이메일 전송에 관한 글을 쓸 예정이다. 먼저 Java + Spring + maven 환경에서 개발할 때를 기준으로 글을 작성할 예정이고, Itextpdf, pdfbox라는 외부라이브러리를 사용했기 때문에 Itextpdf를 이용하여 암호설정을 하는방법을 정리한다. (회사에서 사용하고 있는설정이라 그대로 사용) [maven의존성 추가] com.itextpdf itextpdf 5.5.13.3 org.apache.pdfbox pdfbox 2.0.1 다음과 같이 코드를 작성해주면 된다. (예외 throws, 생성된 파일을 이메일로 발송하는데 쓸것이기 때문에 fi..

JAVA 2022.04.14

Java의 UnsupportedOperationException (feat array, List)

개발을 하던 와중에 Arrays의 asList를 이용해서 리스트를 선언과 초기화를 해준 뒤 다음 이후에 리스트를 추가하거나 삭제하려고 했더니 UnsupportedOperationException이 발생했다. 에러 메세지만 보면 내가 작성한 코드가 지원할 수 없다는 내용인데, 이유를 찾아보니 Arrays.asList는 배열을 리스트로 그냥 덮어씌운상태(래핑)로 변경되고, 변경된 상태의 데이터들은 배열을 이용하고 있고 asList자체가 타겟으로 들어온 배열의 길이를 고정된 값으로 리턴하기 때문에, add나 remove를 사용할 수 없다는 것 같다. 다만 set을 이용하면 데이터 교체는 가능하다. 결론적으로 asList를 이용해서 내가 원하는 결과(List로 리턴받아 add, remove)를 수행하려면 다음과..

JAVA 2021.12.08

Java 클래스의 변수명 가져오기

오늘은 Java Class에서 변수명, 어노테이션의 정보를 가져오는 방법을 정리해보려고 한다. 해당내용은 내가 작업하면서 사용했던 내용은 아니지만, 동료 직원이 고민했던 문제를 같이 고민하면서 찾게 되었기에 정리해본다. 대략 아래와 같은 클래스가 있을떄(보통 모델이나 뷰오브젝트 클래스) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //Lombok을 이용하여 Getter, Setter를 생략 @Getter @Setter public class TestClass { private Long id; private Integer seq; private String name; private String address; private String type; private Doubl..

JAVA 2021.11.23

Java 실수형 자료 계산하기

백준문제들을 풀다보면, 실수로 결과 값이 나오고 특정 소수점자리에서 반올림하는 문제들이 종종 있는데, 회사에서 개발을 할 때는 안정적인 BigDecimal 자료형을 이용해서 계산했는데(보통 회사에서 무언가를 계산하는 경우에는 정확한 값이 필요하기때문에 필수적으로 BigDecimal을 이용해야함) BigDecimal을 이용하면 속도가 느리다는 소리를 들은 것 같아서 알고리즘 문제를 풀때는 Double이나 Float을 이용하게 된다. (찾아보니 BigDecimal은 함수를 이용하여 계산하기 때문에 더 느리다고한다. / Number클래스를 상속받은 자식 클래스니까..) 여튼 문제에서는 결과 값을 소수점 셋째자리에서 반올림한 결과를 출력하라 였는데, 나는 떠올랐던 생각이 Math.round를 이용하는 것 이였기..

JAVA 2021.06.08

Java를 처음부터 다시 살펴본 후기

한 달 전 인프런에 Java 인강이 무료로 풀렸길래, 이 기회에 처음부터 다시 보는 것도 괜찮을 것 같아서 처음부터 다시 살펴보았는데, 처음 자바를 배울때에는 생각하지 제대로 이해하지 못했던 개념들(상속, 인터페이스, 추상메서드)를 이번 기회에 이해할 수 있게되었다. 강의를 듣다보니 실무를 하면서 어떻게하면 효율적이고, 객체지향적으로 짤 수 있을까라는 고민을 할 수 있게되는 기회였던 것 같다. 강의 내용이 짧아서 조금 부족한 부분들은 구글을 통해 검색하거나, API문서를 보면서 학습했는데 이 부분도 도움이 되었던 것 같다. 실제로 Java를 사용하여 개발을 하고 있어도 Java인강을 다시 들어보는 것도 좋은 것 같다. 아래는 이번에 Java 인강을 들으면서 정리했던 내용을 기록했던 github주소이다. ..

JAVA 2021.05.21

JAVA의 Optional 정리 (Java 8 기준)

오늘은 Java의 Optional에 대해서 정리해보려고 한다. Optional class는 Java 8 부터 도입된 클래스로 공식 API 설명에 따르면 "null이 아닌 값을 포함하거나 포함하지 않을 수있는 컨테이너 객체" 라고 한다. 마이바티스나 아이바티스를 쓴다거나 Java 8버전 이하로 개발을 한다면 익숙해지기 어려운 개념인 것 같은데, 나의 경우는 회사에서 JPA를 사용하고 있고, Spring JPA의 JpaRepository의 findOne, findById.. 등의 결과 값이 Optional로 돌아오기 때문에 익숙해질 수 밖에없다. 여기서는 내가 주로 사용하는 Optional의 메소드만 코드로 정리 할 예정이고, 이외의 메소드는 아래표나 공식 문서를 참조하는 것이 좋을 것 같다. (아래 표도 ..

JAVA 2021.03.22

Eescape된 HTML 태그를 JAVA에서 Unescape

개발을 하던 도중 html태그와 text내용이 섞여있는 데이터를 DB저장 한 뒤 뿌려줄 일이 있었는데, 프론트단에서 보낸 html태그 들이 서비스단을 통과하면서 html 엔티티로 변경되어 저장되는 문제가 발생했다. 본래 서비스단에서 html 엔티티로 변경되는 이유는 보안적인 이슈(XSS) 때문에 변경되게 설정이 잡혀있는 것으로 알고 있었는데, 일단 기능 구현하려는 페이지는 내부적으로 사용하는 페이지였기 때문에 그냥 html 엔티티로 escape 되는 부분을 바꿔줘야 했다. 일단 고민해본 방법으로는 html 엔티티로 바뀌어져 들어오는 부분을 정규식을 이용해서 replace하는 방법이 있었는데, 정규식의 경우 눈에 잘 안들어 오기도하고 모든 html 엔티티에 대한 정규식을 작성하는 것에도 어려움이 있어, 찾..

JAVA 2021.03.03

Stream.filter()을 이용해 하나의 원소만 리턴받기

오늘은 stream클래스의 filter 메소드를 사용하고 있던중, 필터링 되어 리턴되는 결과값이 한 개만 되도록 하고싶을떄 사용할 수 있는 방법을 정리하려고 한다. 본 내용은 글로써 서술하는 것보다 코드를 보며 정리하는게 좋을것같아 바로 코드를 보려고한다. 코드는 다음과같다. 123456789101112131415161718192021222324252627282930/* Member이라는 테이블(Entity)가 존재하고 모든 Member의 리스트중에서 유니크한 값을 이용해 필터링하는 상황을 가정 class 중략..*/ public testMethod(Long id) { List members = memberRepo.findAll(); Member resultMember = new Member(); // ..

JAVA 2021.01.26

String 배열을 다른자료형 배열로 변경하는 방법

오늘은 String값이 저장되어있는 배열을 Long, Integer등의 자료형으로 변경하는 방법에 대해서 정리하려고 한다. 알고리즘 문제를 풀 때 split을 자주 사용한다면 한번쯤은 고민해봤을 문제일 것 같다. 코드로 살펴보면 다음과 같다. 1234567891011121314151617181920212223242526import java.io.*;import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] value = read..

JAVA 2020.12.31

JAVA System.in에서의 EOF(End of File) 컨트롤

저번 글에서 BufferdReader와 Scaner에 대해서 정리했었는데, 알고리즘 문제풀이에서 주로 사용하기 때문에 정리했었다. 그런데 알고리즘 문제 풀이중에서 종종 input종료 조건에 대한 지문이 없는경우가 있는데, 이 글을 쓰기 전 까진 그냥 무한루프를 돌리는 건가? 라고 생각하고 디버깅을 시도했는데, 결과는 당연히 런타임에러였다. 이후 문제를 자세히 읽어보니 EOF라는 키워드가 있어서 EOF에 대해서 찾아보고 정리하려고 한다. 먼저 EOF는 End Of File 약어로 데이터로부터 더이상 읽을 수 있는 소스가 없다라는 의미로 보통 반복문의 종료시점을 설정하기 위해서 사용하는 것 같다. 이 글에서는 BufferdReader와 Scanner의 while문에서의 EOF만 정리하려고 한다. 코드는 다음..

JAVA 2020.12.23