전체 글

.
Java에서는 값을 비교 할 때 동일성 (==), 동등성 (equals)로 비교합니다. 이중에서 Long을 동일성(==) 비교했을 때 어떤 일이 발생하는지 알아보겠습니다~ Long을 동일성 비교하게되면, 특정 상수풀(-128 ~ 127) 까지는 정상적으로 동작을합니다. 이래서 아무생각없이 함정에 빠졌습니다. 127 이상으로 넘어가니 동일성으로 비교가 되지않는 것을 확인했습니다. 결론은 객체 비교는 항상 equals를 사용하자 입니다.
Java ChcekdException, UncheckedException과 Srping에서 DB @Transactional 어노테이션을 사용했을 때 어떻게 되는지에 대한 글입니다. Exception은 자바에 대한 부분이고, @Transactional은 Spring에 대한 부분이라 카테고리를 Java로 잡아야 할지, Spring 으로 잡아야 할지 굉장히 고민되었던 부분입니다.😅 일단 자바의 Exception은 크게 두 부류로 나뉩니다. Checked Exception과 RuntimeException을 상속받은 Unchecked Exception으로 나뉘어집니다. RuntimeException은 이름에서도 알 수 있듯이 실행 시 발생하는 Exception이고, Checked Exception은 컴파일 시 확..
REST API가 무엇인지 알아보고, API 설계 시 고려해야 할 점들을 알아보겠습니다. REST란? HTTP 저자 중 한 명인 로이 필딩이 HTTP의 우수성을 잘 살리지 못하는 것 같아 장점을 잘 살릴 수 있는 아키텍처로 REST를 고안해냈습니다. 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다. REST API 구성 REST API는 크게 세 구성으로 나눌 수 있습니다. 자원(RESOURCE) - URI 행위(Verb) - HTTP METHOD 표현(Representations) - Http Message Payload 자원을 이름으로 구분(URI)하여 해당 자원의 상태를 조회(GET) 하거나, 자원의 상태를 생성(POST), 수정(PUT, PATCH), 삭제(DELETE)..
불변 객체와 가변 객체는 Multi Thread 환경에서 개발할 때 이해해야 할 중요한 개념입니다. 일단은 단어에 대한 설명만 살펴보면 불변 객체 Java에서 Class의 인스턴스가 생성 된 후 상태가 변하지 않는 객체, Multi Thread 환경에서 안전하게 사용할 수 있다는 신뢰성이 보장됩니다. 가변 객체 Java에서 Class의 인스턴스가 생성 된 후 상태가 변할 수 있는 객체, Multi Thread 환경에서 별도의 동기화 처리가 필요합니다. 이렇게 글로만 보면 무슨 말인지 잘 이해가 안갑니다. Java에서 Class의 인스턴스가 생성 -> 소스에서 new Class(); 상태가 변하지 않는 -> 어렵습니다.. 뭔 상태요.. 예를 들어 클래스가 있으면 클래스 안의 멤버변수가 Primitive T..
개발을 막 시작했을 무렵(1년?)부터, Spring Security를 처음부터 설정해본게 한 3~4번은 되는 것 같은데, Security에 대한 구조를 부분 부분만 이해하고 있는 것 같아서 정리 하기위해 적습니다. Filter는 이 글에서 다루지 않겠습니다. 길이 너무 길어지기도 하고, 내용도 꽤나 많기 때문에... Spring Security에서의 용어를 확실하게 알고 이해하면 더 쉽기 때문에 먼저 용어정리를 합니다. Spring Security에서 사용되는 용어 접근주체 (Principal) - 보호받는 리소스에 접근하는 대상 - ex) 로그인 아이디 비밀번호 (Credential) - 인증을 위한 비밀번호 - ex) 로그인 패스워드 권한 (Authority) - 해당 사용자가 자원에 접근 가능한지 ..
· 인프라
AWS의 로드밸런서인 ALB를 사용하던 중 문득 궁금함이 들어 정리해 봅니다. 왜 꼭 ALB를 썼어야 했을까? 차이점은 L4, L7 에 있었습니다. NLB가 L4, ALB가 L7 입니다. 각각 로드밸런서를 이해하기 위해서는 일단 OSI 7 계층에 대한 간략한(?) 이해가 필요합니다. 각 계층 별 사용되는 프로토콜이 존재하고, L4(Layer 4)에서 사용하는 프로토콜은 TCP, UDP, ARP L7(Layer7)에서 사용하는 프로토콜은 HTTP, FTP, DNS 등이 있습니다. 상위 레벨의 Layer는 하위 레벨 Layer를 이해할 수 있어야 합니다. 즉, L7 로드밸런서는 L4 로드밸런서의 TCP로 할 수 있는 IP, 포트로 로드밸런싱 도 가능해야 합니다. 제가 사용했던 ALB는 L7에서 동작하는 로드..
JVM에 대해 다시 공부하다, 정리가 한 번 필요할 것 같아서 정리 해봅니다. 개발자들이 작성한 .java 코드가 어떻게 실행 되는지 한 눈에 알아 볼 수 있는 그림입니다. Java개발자라면 이클립스, 인텔리제이, vscode 등 IDE를 이용하여 개발할 때 JDK가 필요해 각자 본인 PC에 Java를 설치할 것 입니다. JDK를 설치하면 javac 명령어를 사용할 수 있습니다. javac 명령어로 .java 파일을 컴파일하게되면 바이트 코드인 .class 파일이 생성되고 JVM이 샐행할 메모리를 OS로 부터 할당 받습니다. 그 후 JVM의 Class Loader에 의해 클래스 파일을 읽어 옵니다. JVM 위에서 실행 되기때문에 Java를 OS에 상관없이 실행시킬 수 있습니다. 그럼 JVM은 어디에 있을..
0. git init - local에 git 저장소 생성 1. git log - git commit log를 보여준다. - git log --oneline 으로 간결하게 확인가능 2. git reset (이력남기지 않고 되돌리기) HEAD^ 위치에는 git log를 통해 확인한 commit key값을 넣을 수 있다. - git reset --soft HEAD^ head commit 취소 후 staged 상태로 워킹 디렉토리에 보존 - git reset HEAD^, git reset --mixed HEAD^ head commit 취소 후 unstaged 상태로 워킹 디렉토리에 보존 - git reset HEAD~2 마지막 2개의 commit 취소 - git reset --hard HEAD^ head com..
개발서버에서 테스트하던 와중에 오랜 시간이 지난 후 WAS에서 DB로 요청을 하게 하였더니 java.sql.SQLNonTransientConnectionException: (conn=18546) Connection reset 에러가 발생하였습니다. 확인해 보니 서버 DBCP 설정에 spring.datasource.dbcp2.test-on-borrow 설정이 'true'로 되어 있었습니다. connection pool에서 connection을 가져올 때 해당 connection이 유효한지 검증을 할 수 있게 설정하는 옵션이었습니다. 해당 옵션으로 인해 spring.datasource.dbcp2.validation-query에 설정된 쿼리가 동작하였습니다. 하지만 validation-query가 동작하였을 ..
· Database
테스트를 위해 데이터를 Insert 하던 중 LocalDateTime으로 변환할 수가 없어 에러가 발생하였습니다. H2 Database의 프로그램 실행 시 기본 실행되는 sql파일인 import.sql 에 PARSEDATETIME('Sat, 3 Feb 2001 03:05:06 GMT', 'EEE, d MMM yyyy HH:mm:ss z') 형식으로 시도해 봤으나, 날짜 중 월을 영어로 간략히 표시한 'Feb'를 파싱할 수 없어 에러가 발생. 3번째 인자로 Locale값을 추가하니 정상 동작하였습니다. PARSEDATETIME('Sat, 3 Feb 2001 03:05:06 GMT', 'EEE, d MMM yyyy HH:mm:ss z', 'en') 그 후 날짜 중 일에 해당하는 부분의 length가 1~2로..
infitry
디벨뤼팽