전체 글
-
Generics와 wildcardjava 2021. 6. 1. 10:42
배경 Java 5부터 나온 Generics는 매우 빈번하게 사용하는 문법이다. Spring코드를 좀만 들여다봐도 Generics를 사용하지 않은 클래스를 찾는 게 더 어려울 정도다. 기초적인 부분은 생략하고 복잡한 문법이나 주의사항에 대해 짚고 넘어가보자. 토비님의 유튜브를 보며 정리했다. https://www.youtube.com/watch?v=ipT2XG1SHtQ&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=12 https://docs.oracle.com/javase/tutorial/extra/generics/morefun.html Generics를 사용하는 이유 컬렉션에 데이터를 보관할 때 클래스 단위로 작업을 하는 경우가 많다. 위 예시의 경우 머릿속에서 St..
-
JDBC Timout 이해하기database 2021. 5. 31. 12:25
Timeout 이해하기 Timeout 계층 구조 위 그림처럼 timeout은 계층적 구조를 갖고 있다. 상위timeout은 하위timeout에 의존적이다. 즉, 하위 timeout이 제대로 동작해야지 상위 timeout 또한 제대로 동작한다. 예를 들어 TransactionTimeout은 StatementTimeout이 제대로 처리되어야 본인의 처리를 할 수 있다. 좀더 곰곰이 생각해보면 상위 timeout을 하위 timeout보다 적은 시간으로 설정하는 건 무의미하다고 볼 수 있다. 최 하위인 JDBC Driver SocketTimeout은 OS의 SocketTimeout에 의존적이다. 즉, java의 설정이 아닌 OS의 설정에서 소켓 timeout이 발생하면 JDBC Driver SocketTimeo..
-
Stream 정리 및 예제java 2021. 5. 29. 10:50
배경 https://stackify.com/streams-guide-java-8/ 위 글 변역하며 공부 Introduction stream은 datasource의 래퍼클래스이며 대용량 처리를 간편하고 빠르게 작업하도록 도와준다. stream은 데이터를 저장하지 않으므로 자료구조라고 보는 건 부적절하며 원본datasource를 변경하지 않는다. Stream Creation of() 외에도 스트림을 만드는 다양한 방법이 있고 배열이 아니더라도 컬렉션을 통해 스트림을 만들 수 있다. Stream Operation forEach forEach()는 하나의 스트림을 소모하면서 그에 맞는 action을 수행하므로 Cunsumer 콜백을 전달하면 된다. forEach()는 종결스트림함수로 호출하면 더이상 새로운 연산..
-
Optional 정리java 2021. 5. 28. 20:23
배경 https://stackify.com/optional-java/ 위 글 번역하며 정리 Overview Optional이 설계된 주된 이슈는 자바에서 매우 중요한 NullPointerException을 안전하게 다루기 위함이다. 우선, Optional은 값을 래핑하는 클래스다. 값이 비어 있거나 객체로 채워져 있을 수 있다. Optional은 함수형 프로그래밍과 밀접하게 연관되어 있다. Optional 객체 만들기 빈 객체 empty() static 메서드를 통해 미리 만들어둔 불변 객체를 반환한다. empty인 상태에서 get()을 호출하면 NoSuchElementException이 발생함을 알 수 있다. 또한 Optional의 value는 final이 붙은 불변객체이므로 미리 만들어둔 empty(..
-
Inner class와 static 조합java 2021. 5. 27. 10:41
배경 HashMap 내부를 공부하다보면 수많은 inner class가 정의된 걸 볼 수 있다. Effective Java 아이템 24에서도 inner class에 대한 조언을 주는데 왜 inner class를 사용하며 적절한 사용을 위해 어떤 걸 알아야 하는지 공부해보자! 왜 쓰지? 돌고돌아 공식문서까지 왔다. 내용을 확인해보자. - 어떤 클래스가 한 클래스에서만 유용하게 쓰인다면 물리적으로 하나의 클래스로 묶을 수 있다. - private수준에서도 내부클래스는 외부클래스 맴버 또는 메서드에 접근할 수 있기 때문에 캡슐화에 용이하다. - 가독성이 좋고 유지보수가 쉬운 코드를 작성할 수 있다. Map은 key와 value를 논리적으로 하나의 쌍으로 묶은 자료구조다. 상황에 따라 key만 다루고 싶은 경우가..
-
Effective Java 모든 객체의 공통 메서드java 2021. 5. 25. 12:01
equals()는 일반 규약을 지켜 재정의하라 equals()를 오버라이딩하지 않는다면 위처럼 모든 클래스가 위 equals()를 상속받는다. == 비교로써 두 객체 인스턴스가 물리적으로 동일한 객체인 경우만 true를 반환한다. equals()를 오버라이딩할 때는 사이드이팩트가 많아서 주의를 기울이거나 아예 오버라이딩하지 않길 권장한다. 그래도 물리적인 비교가 아닌 논리적 비교가 필요한 경우가 있으니 주의사항을 알아보자. 반사성(reflexivity) x.equals(x)는 반드시 true를 반환하여야 함을 말한다. 의도적으로 false를 반환하지 않는 한 이 규약은 지켜질 거고 직관적으로 이해해기 어렵지 않다. 대칭성(symmetry) 객체를 비교할 때 교환법칙이 성립해야함을 의미한다. 즉, x.eq..
-
Spring Hibernate + Redis + MailSender 트랜잭션 동기화spring/JPA 2021. 5. 24. 11:31
배경 현재 프로젝트에서 사용자가 회원가입을 한 경우 흐름을 보면 DB에 사용자 저장(Hibernate) -> 인증코드 생성 후 이메일로 전송(MailSender) -> Redis에 이메일(key)+인증코드(value) 저장하는 로직이다. 이후 사용자 인증을 시도한 경우 Redis에서 데이터를 찾아 인증을 확인 후 사용자의 권한을 업그레이드한다. 흐름은 크게 3가지로 나뉘고 이 3가지 흐름은 원자적으로 묶여야 한다. 즉, 하나라도 실패한 경우 전부 실패해야하고 성공한다면 전부 성공해야 한다. 트랜잭션과 예외처리를 통해 간단하게 세 프로세스를 원자적으로 묶어보자. 상황 분석 1) redis에 우선 Hello를 key로, World를 value로 저장한다. 2) Hibernate로 member를 저장한다. 3..
-
Spring 다중 데이터소스 설정 및 트랜잭션 동기화spring/JPA 2021. 5. 23. 17:53
배경 서비스 규모가 작다면 한 애플리케이션에서 보통 한 DB리소스만 사용한다. 어떤 경우는 둘 이상의 DB접근이 필요한 경우도 있고 서로 다른 두 DB서비스를 논리적인 트랜잭션 단위로 묶어 작업을 원자적으로 처리할 필요가 있다. 심지어 DB가 아니더라도 JMS와 같은 서비스 또한 한 트랜잭션 단위로 묶일 필요가 있다. 이번 글에서 위 2가지 경우를 예제로 작성해보고 정리해보자. 1. 한 애플리케이션에서 두개의 DB 연결 2. 두 DB의 작업을 트랜잭션으로 묶어서 처리하기 배경지삭 쌓고 가기 - 로컬 트랜잭션 : 하나의 DB커넥션 안에서 말들어지는 트랜잭션 - 트랜잭션 경계설정 : autoCommit를 false로 설정한 뒤 commit 또는 rollback을 원하는 시점에 호출 - PlatformTran..