본문 바로가기

Backend37

[JAVA] List 반복문 안에서 객체 remove (feat.ConcurrentModificationException) List 를 돌면서 조건에 부합하는 객체는 해당 List 에서 제거를 해줘야 했다. 하지만 List(Collection.....😩) 를 루프돌면서 remove 하는 것은 쉽고 간단하지 않았고 ( 테스트 도중 빈번하게 ConcurrentModificationException 요 아이와 마주했다;ㅎ) 구글링에 나오는 아래 두 가지 방법을 했지만 뭔가.. 소스 읽기도 힘들고 이중으로 돌아서 NPE 아이가 올 때도 있어서 아예 메소드를 리팩토링했다. 1. while(it.hasNext()) {} 2. for (Iterator it = List.iterator(); it.hasNext();) {} 바로 JAVA8 이상에서만 사용할 수 있는 List.removeIf() !! https://docs.oracle.co.. 2020. 8. 6.
[JAVA] 객체(Model) 를 통으로 화면에 찍기 (대체:@Data, .toString()) 이번에 신규 프로젝트를 작업하면서, 화면을 작업하다가 객체에 내가 원하는 데이터가 잘 있는지 디버깅해보고 싶어서 사용했던 방법을 공유하고자 글을 작성한다. 보통 화면에서 객체 디버깅을 한다면, 1. lombok 의 훌륭한 @Data 어노테이션을 사용하거나, 2. .toString() 메소드를 오버라이딩으로 확인하면 되겠지만, 이 글에선 두 방법 모두 사용하지 않고 Gson 으로 디버깅하였다. === TMI 개인적으로 @Data 어노테이션 남발을 금지하고, .toString() 오버라이딩은 지저분해보이고 별로 선호하지 않기 때문에.. 핵심은 GsonBuilder 의 .setPrettyPrinting() :) /** * 화면 출력용 컨트롤러 (임시) todo: 테스트 끝나면 제거 */ @PostMapping.. 2020. 5. 11.
[Java] 문자열이 Enum 에 포함되어 있는지 확인하는 방법 입력받은 문자열에 대한 검증이 필요했고, 그 문자열은 Enum 으로 관리하는 영역에 대한 문자열이었다. 고로.. 나는 입력받은 문자열이 Enum 의 값과 일치하는지 확인해야했다 :) #1. Stream 사용 Arrays.stream(이넘.values()).anyMatch(v -> v.name().equals(문자열)); #2. Enums 메소드 사용 Enums.getIfPresent(이넘.class, 문자열).isPresent(); #3. EnumUtils 사용 // 기본 EnumUtils.isValidEnum(이넘.class, 문자열); // 기본 + 대소문자 무시 EnumUtils.isValidEnumIgnoreCase(이넘.class, 문자열); 이 중 3번째 방법이, 대소문자 무시해주는 메소드가 .. 2020. 3. 23.
[JAVA] 사용했던 정규식 모음 DTO 에 받는 필드들의 유효성 검증을 위해 @Pattern 어노테이션을 활용하기로 했다. 그 중 사용했던 정규식을 잊지 않기 위해 정리함.. 😊 1. 우편번호 포멧 (6자리 숫자 또는 건물번호(n, nn, n-nn, nn-n, nn-nn)) [0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2} "123-456" -> 성공 "12-34" -> 성공 "1234" -> 성공 "1234-" -> 실패 2. 날짜 포멧 (YYYY-MM-DD 또는 YYYYMMDD) [0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2} "20200202" -> 성공 "2020-02-02" -> 성공 "2020-0202" -> 성공 "202002021" -> 실패 "2020-02--02" -> 실패 3. 비밀번호 포멧 (숫.. 2020. 3. 10.
[Java] InputStream 활용하여 byte 읽을 때 짤림 현상 조치 InputStream 활용하여 byte[] 로 데이터를 읽는데, 읽을 데이터가 너무 많아서 그런지 마지막에 [][][][][][][][][]... 이렇게 짤렸다. InputStream is = zipFile.getInputStream(zipEntry); byte[] dataArray = new byte[is.available()]; is.read(dataArray); is.available() 을 썼음에도 불구하고 ㅠ 그래서 해결한 방법은! InputStream is = zipFile.getInputStream(zipEntry); byte[] dataArray = is.readAllBytes(); InputStream.readAllBytes() !! 단, 이 방법은 Java9 이상 사용가능하다. 참고) .. 2020. 1. 28.
Spring Framework 에서 AOP 로 Logging 서비스 만들기 AOP 카테고리의 첫 게시물에서는 너무 예전 버전을 중심으로 작성했었고, 이 게시물의 마지막은 '요즘은 너무 캡슐화, 추상화가 잘 되어있다..' 였는데 ㅋㅋㅋ 이제야 그 방법을 통해! AOP 를 만들어 보았습니다. 이전 게시물 -> https://vvh-avv.tistory.com/7 AOP 기본 정리 앞서, AOP와 AOP에서 자주등장하는 단어들을 정리한 페이지가 있으니 참고하자. 2018/05/01 - [용어정리] - 05) AOP 일상생활에 빗대어 AOP를 쉽게 이해하려면 은행시스템의 입출금기능을 구현한다고 생각해보자... vvh-avv.tistory.com [개발 방향] 우선, (기본 Spring Framework 세팅이 다 되어있다는 가정하에) 정의한 개발방향은 아래와 같았다. 1. Contro.. 2019. 10. 23.