1장 HTTP 웹의 기초작성일시: 2022년 7월 1일 오후 2:00HTTP는 신뢰성 있는 데이터 전송 프로토콜 을 사용하기 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되거나 꼬이지 않음을 보장한다.웹 클라이언트와 서버웹 콘텐츠는 웹서버에 존재한다. 웹서버는 HTTP프로토콜로 의사소통하기 때문에 HTTP 서버라고도 부름웹서버는 데이터를 저장하고 HTTP클라이언트가 요청한 데이터를 제공한다.가장 흔한 웹클라이언트는 익스플러, 파이어폭스, 크롬 같은 웹브라우저이다. 웹브라우저는 서버에게 HTTP 객체 요청을하고 사용자의 화면에 보여준다.리소스웹 서버는 리소스를 제공한다.웹 리소스는 웹 컨텐츠의 원천이며 단순한 웹리소스로는 정적파일 도 있고, 요청에따라 콘텐츠를 생성하는 동적 콘텐텐츠 파일 리소스..
게시글
자바는 멀티 쓰레드 프로그래밍이 가능한 언어이다. 만약 멀티 쓰레드 작업을 해야하는 상황이 있다면 자바의 CountDownLatch를 함께 활용하면 좋다.CountDownLatchCountDownLatch는 하나 이상의 스레드가 다른 스레드에서 수행중인 작업이 완료될 떄 까지 기다릴 수 있도록 해주는 클래스다. 예를 들어 어떠한 스레드에서 5개의 스레드를 생성하고 해당 스레드가 완료 된 후에 어떠한 작업을 처리해야하는 상황이 있다면 CountDownLatch를 활용하여 쉽게 구현할 수 있다.사용법생성 final int JOB_COUNT = 5; CountDownLatch latch = new CountDownLatch(JOB_COUNT);CountDownLatch 생성할때 작업할 스레드 갯수를..
toString을 항상 재 정의하라 Object의 toString 메서드가 우리가 생성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 자바 문서에 Object 객체 toString 메서드를 확인해보면 결과값으로 간결한 정보를 담아 누구나 쉽게 읽을 수 있도록 해야하며 모든 서브 클래스가 재 정의하는걸 추천한다고 적혀있다. println, printf, 문자열 연결 연산자 (+), assert 구문같은 경우에는 객체를 호출할때 자동으로 toString 메서드를 호출한다. 그래서 toString 메서드를 잘 구현한 클래스는 사용하기도 편리하고 디버깅할때도 매우 유용하다. toString 정의 정적 유틸 클래스는 제외하고 실전에서는 사람 이름, 나이, 전화번호 등과 같은 객체가 가진 주요 정보들을 모..
equals를 재정의하려거든 hashCode도 재정의 해라 equals를 재정의한 클래스 모두 hashCode를 재 정의 해야한다. 재 정의 하지않으면 hashCode 일반 규약을 어기게 되는거고 HashMap이나 HashSet을 사용할 때 문제가 발생할 수 있다. 자바 문서에 Object 객체 hashCode 메서드에는 이런식으로 명시 되어있다. - equals비교에 사용되는 정보가 변경되지 않았다면, 어플리케이션 실행 중 hashCode를 몇번 호출하더라도 동일한 값을 반환 해야한다. - equlas(Object)가 두 객체를 같다고 판단하면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. - eqauls(Object)가 두 객체를 다르다고 판단했을때도 다른 hashCode를 반환 할 필요..
equals는 일반 규약을 지켜 재정의하라 equals 메서드를 재 정의 할떄는 반드시 정의된 규약을 지키며 재 정의를 해야한다. 만약 이 규약을 어기면 그 객체를 사용하느 다른 객체들이 어떻게 반응할지 알 수 없다. equals 메서드의 일반 규약 equals 메서드는 동치관계를 구현하며 다음을 만족한다. 반사성(reflexlvity) 반사성은 null이 아닌 모든 참조 값 x에대해, x.equals(x)는 true이다. 단순히 말하면 객체는 자기 자신과 비교했을떄 항상 같아야한다는 것이다. 대칭성(symmetry) 대칭성은 null이 아닌 모든 참조값 x,y에 대해 x.equals(y)가 true면 y.equals(x)는 true이다. 두 객첸느 서로에 대한 동치 여부에 대해 똑같이 대답 해야한다는 ..
try-finally보다는 try-with-resources를 사용하라 자바에는 InputStream, OutputStream, BufferedReader, java.sql.connection과 같이 close 메서드를 호출하여 직접 닫아줘야하는 자원들이 많다. 하지만 이러한 자원들은 사용 후 close 메서드를 호출하지 않는다면 예측할 수 없는 성능 문제로 이어지기도 한다. 이러한 자원 중 상당수가 close 메서드가 호출되지 않았을때 방안으로 finalizer를 활용하고는 있지만 finalizer같은 경우에는 호출 시점이 불명확해 믿을만하지 못하다. try-finally 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally문을 쓰였다. 예외가 발생하거나 메서드에서 반환되는 경우를 포..
finalizer와 cleaner 사용을 피하라 자바에서는 finazlier와 cleaner라는 두 가지 객체 소멸자를 제공한다. 이 두 가지의 객체 소멸자는 C++의 파과자( destructor )와는 다른 개념이다. C++의 파괴자 같은 경우에는 특정 객체 와 관련된 자원을 회수하는 보편적인 방법이며, 자바 같은경우 try-with-resource와 try-finally를 이용하여 해결한다. finalizer와 cleaner의 공통적인 문제점 이 둘의 공통적인 문제점은 객체의 접근 할 수 없게 된 후 finalizer와 clenaer가 실행되기까지 얼마나 걸릴지 알 수 없다. 즉 finalizer와 clenaer로는 제때 실행되어야 하는 작업을 할 수 없다. 예를 들어 파일 닫기같은 작업을 이 둘에게..
다 쓴 객체 참조를 해제하라 JAVA는 C, C++처럼 메모리를 직접 관리해주지 않아도 상황에따라 가비지 컬렉션이 작동하여 메모리를 정리해준다. 그래서 개발할때 메모리 관리에 신경을 쓰지 않아도 된다라고 오해할 수 있는데 잘못된 생각이다. 메모리 관리에 신경쓰지 않고 개발시 문제점 사용하지 않는데 값을 계속 참조하고있으면 가비지 컬렉션이 해당 값을 정리하지 못한다. 그렇게되면 메모리 사용량이 늘어나 성능이 저하되고 심할때는 디스크 페이징이나 OutOfMemoryError를 일으켜 프로그램이 종료 될 수 있으므로 다 쓴 참조는 null 처리 해주는게 좋으며 재 참조시 NullPointException을 발생시켜 조기에 문제점을 찾을 수 있다. 자기메모리를 직접 관리하는 클래스 사용시 주의할점 public ..
개발 환경 Spring boot: 3.2.1 Spring Security: 6.2.1 문제 Spring Security 6에서 Path마다 FilterChain을 다르게 적용하다가 문제가 발생하였다. Spring Secuirty는 설정한 filterChain 모두 FilterChainProxy의 filterChains 배열에 모두 저장하고 매 요청마다 getFilters에서 요청 경로와 매칭되는 filterChain을 찾아 적용한다. 내가 겪은 문제는 설정한 FilterChain들은 모두 등록이 되었지만, 모든 FitlerChain의 request Matcher가 any request로 등록이 되어 모든 요청이 첫번째 FilterChain을 사용하는 문제가 발생했다. @Configuration @Enab..
불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성해서 사용하기보다는 객체 하나를 재사용 하는 편이 나을때가 많다. 재사용은 빠르고 편하며, 불편 객체는 언제 재사용 할 수 있다. String s = new String("bikini"); String s = "bikini"; 위 두 코드는 문자열 bikini를 String 타입 s에 저장하지만 동작 방식이 다르다. 첫번째 코드는 매번 새로운 인스턴스를 Heap에 생성하여 변수에 할당하지만, 두번째 코드는 "bikini"라는 문자열이 처음 나왔을때만 Heap영역 string pool에 저장하고 리터럴 "bikini"를 사용하는 모든곳에서 공유되어 같은 객체를 재사용함이 보장된다. 값이 비싼 객체는 캐싱해두어 사용하기 객체중 생성 비용이 아주 비싼..