목록Today I Learned (46)
ㅇ.ㅇ

소스 코드를 짤 때, 하나 둘 import를 하게되면 어느순간 자동으로 wildcard(*)로 변환된다. 나는 이제껏 그게 당연하거라고 생각했는데 사실 이렇게 사용했을 시 야기되는 문제들이 있다. 와일드카드(*) 임포트의 문제점import java.util.*;와 같은 와일드카드 임포트는 java.util 패키지에 있는 모든 클래스를 임포트하겠다는 의미이다. 이 방식은 코드의 간결함 때문에 많이 사용되지만, 몇 가지 문제가 있다.가독성 저하어떤 클래스가 실제로 사용되고 있는지 명확하지 않다. 예를 들어, java.util에는 List, Map, Set 등 많은 클래스가 있는데, 코드에서 어떤 클래스를 사용하는지 한눈에 알기 어려워진다. 이로 인해 협업이나 유지보수 시 불편함이 생길 수 있다. 개발 컨벤..

이번에 천천히 TDD 공부를 해보면서 사용해봤던 테스트 관련 어노테이션을 정리해보려고 한다. 이렇게라도 한번 적지 않으면 그냥 계속 사용방법만 아는채로 사용하기 때문이다. 1. @TestJUnit5의 기본 테스트 메서드 어노테이션해당 메서드가 테스트 메서드임을 명시한다.메서드의 반환 타입이 void여야 하고, 파라미터를 받지 않는다.@Testvoid testAddition() { int result = Calculator.add(1, 2); assertEquals(3, result);} 2. @DisplayName테스트 메서드의 이름을 설명하는 어노테이션테스트를 더 직관적으로 이해할 수 있도록 이름을 지정할 수 있다.IDE에서 표시되는 이름으로, 한글이나 특수문자 사용도 가능하다.@Tes..

Utils는 아는만큼 더 빠르고 간편하게 코드를 작성할 수 있는 것 같다. 하나하나 일일이 찾아보지는 못하니까 우연히 알게되면 나중에 사용할 수 있도록 정리를 해보려고 한다. 오늘의 주인공은 FilenameUtils이다. 개념우선 FilenameUtils가 들어있는 Apache Commons IO는, 자바 언어를 위한 오픈소스 라이브러리로 다양한 기능을 제공한다. 이 라이브러리를 사용하면 파일 및 디렉토리 관리 작업을 더욱 쉽게 처리할 수 있으며, 그 때문에 다양한 자바 프로젝트에서 많이 사용되고 있다. FilenameUtils 클래스는 파일 경로, 파일명, 확장자 등을 다루기 위한 여러 유틸리티 메서드를 제공한다. 특히 Windows에서는 \를, Unix 계열 시스템에서는 /를 경로 구분자로 사용하는..

의문자바에서 말하는 Utility Class가 무엇일까? 뭔가 디렉토리상에도 자주 보이고, 가끔 내가 사용하기도 하지만 구체적으로 어떤 역할을 하는지, 어떤 형식을 가지는지 잘 몰랐기 때문에 정리해보려고 한다.답(1) 유틸리티 클래스란?인스턴스 메서드와 인스턴스 변수를 제공하지 않고, 매개 변수에 대해 작업을 수행하는 정적 메서드와 변수만을 제공하는 클래스Static 클래스, Stateless로 사용, 멀티스레드 환경에서 thread-safe대부분 final로 선언되어 상속될 수 없고, 생성자는 private으로 선언되어 초기화 가능성을 막는다(2) 유틸리티 클래스 사용 시 문제점강한 결합유틸클래스를 사용하는 클래스는 유틸클래스에 강한 의존성을 갖게 된다. 추상화 진행이 없으므로 유틸클래스 변화는 해당 ..

상황이번에 다른 피처 브랜치에서 개발한 기능을 현재 최신 브랜치에 병합하는 작업을 해야한다. 어떻게 해야할지 생각을 해보다가 책임님께서 merge와 rebase, cherry-pick을 힌트로 주셔서 실행으로 옮기기 전에 개념을 정리해보려고 한다. 뭔가 익숙하지만 확실히 알고있는게 없었다. Cherry-pick 이란?다른 브랜치에 있는 커밋을 선택해서 내 브랜치에 적용할 때 사용하는 명령어커밋 자체를 옮기는게 아니고 같은 내용을 가지고 있는 커밋을 하나 더 생성하는 것이므로 전체 히스토리를 보았을때는 커밋이 늘어나는 것이다. 그러므로 꼭 필요할 때만 사용할 것!// 체리픽 명령어git cherry-pick // 여러 커밋을 한꺼번에 하고싶을 때git cherry-pick // 연속적인 커밋일 경우 ..

HashSetSet자바의 인터페이스의 한 종류 (ADT = abstract data type = 인터페이스)그 인터페이스를 구현한 class = data structure (자료구조)중복을 허용하지 않는다순서를 보장하지 않는다method = add, contains, delete 등Set 종류(1) hashSet - 순서를 보장하지 않는다(2) sortedSet - 순서를 보장한다Hash Set 구현 방법HashSet의 구현은 HashMap을 활용해서 구현이 되어 있다Hash Mapkey : valuekey는 중복이 되지 않는다그러므로 HashSet은 HashMap의 Key부분을 활용한다.참고 : https://www.youtube.com/watch?v=1Hxm6f33VbY

의문화면에서 404 에러가 노출되고, Failed to delete generated class(java) file 에러가 계속 발생하였다. 찾아보니 tomcat의 work에 카탈리나에 지워지지 않은 파일들이 쌓여서 생긴 것이기 때문에, 정말 work를 날리기만 해도 문제는 해결되었다. 그런데 여기서 work 파일이 뭐 하는 애인지 확실히 뭔지 몰라서 정리해보려고 한다. work 디렉토리란,tomcat - work 디렉토리 work 디렉토리 : jsp 페이지와 서블릿 클래스와 같은 동적 콘텐츠 + 세션파일을 저장하는 임시 디렉토리html코드와 java코드로 이루어진 jsp파일이 서버에 도착하면 컴파일이 되고, java servlet으로 변환되어 그 servlet 클래스는 톰캣 work 디렉토리에 저장된다..

의문하나의 톰캣에 두개 이상의 서비스를 구축하기 위해서는 여러 방법이 있지만 그 중에서도 가장 간편한 것은 port를 다르게 하는 것과 context-path를 다르게 하는 것이다. 톰캣의 server.xml 파일에서 설정하면 되는데, 나는 지금껏 port를 같게 하면 context 또한 무조건 설정을 따로 해줘야 한다고 생각했다. 그런데! 따로 context-path 지정을 안해줘도 정상적으로 작동한다는 것을 발견했다..! 답잘 동작하는걸 떠나서 context 지정을 따로 안 해줬는데 그럼 어떤 걸 path로 삼고 나뉘어지는가에 대해 찾아보니 appBase라는 결론에 도달했다. appBase에 지정된 폴더로 찾아가서 리소스를 찾는 것이다. 그리고 그 리소스 명으로 context가 나뉘어지고 있었다. ..

상황회사 솔루션 맨 처음 설치 할 때 session에서 데이터를 가져오는 로직을 타는데 항상 설치 페이지가 나와야하는데 에러페이지가 떴다. 뭔가 봤더니 session이 null 이라서 nullpoint가 뜨고 있었다.. 어떻게 보면 정말 단순한 에러였는데 나는 왜 false로 해두었던걸까? 그런김에 다시 정리해보자..해결getSession(), getSession(true), getSession(false)getSession(), getSession(true) : HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로운 세션을 생성getSession(false) : HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로운 세션을 생성..

최근에 회사에서 사용자가 등록한 특정 ip가 아니면 로그인 허용을 안하게 하는 로직을 구현한 적 있었는데, ip 등록 기능 때 유저가 제대로 입력했는지 validation 할 때 사용했던 정규식이다. 나는 원래 다른 패턴을 사용하고 있었는데 수석님께서 더 깔끔한 방법으로 알려주셔서 수정된 사항이다. 그런데 정규식.. 원래 구글링하는거 아닌가요? 진짜 빠르게 코드 적어나가시는 게 놀라웠다.. 1. 일반적인 IPv4 정규식- (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.) : 세 번 반복하고 그 다음에 '.'을 빼고 한번 더 private static final String IPV4_REGEX_PATTERN = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-..