전체 글 41

[모던 자바 인 액션] 3장. 람다 표현식

2장에서는 클라이언트의 요구사항에 효과적으로 대응할 수 있는 코드를 동작 파라미터화를 이용하여 만들어 보았습니다. 이번에는 람다 표현식을 어떻게 만들고 어떻게 사용하는지 설명해보겠습니다. 3.1 람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다의 특징 익명: 보통의 메서드와 달리 이름이 없어 익명이라고 표현한다. 함수: 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 표현한다. 전달: 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성: 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다. 예를 들어 Comparator 객체를..

[모던 자바 인 액션] 2장. 동작 파라미터화 코드 전달하기

어떤 상황에서 일을 하든 소바자의 요구 사항은 항상 바뀐다. 시시각각 변하는 사용자 요구 사항에는 어떻게 대응해야 할까? 동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 2.1 녹색 사과 필터링 예제를 통하여 코드를 점차 개선하면서 유연한 코드로 만들어 보자. public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if (GREEN.equals(apple.getColor())) { result.add(apple); } } return re..

[모던 자바 인 액션] 1장. 자바 8, 9, 10, 11 : 무슨 일이 일어나고 있는가?

1.1 역사의 흐름은 무엇인가? 자바 역사를 통틀어 가장 큰 변화가 자바 8에서 일어났다. 자바 8이 등장하기 이전에는 나머지 코어를 활용하려면 스레드를 사용했다. 하지만 스레드를 사용하면 관리하기 어렵고 많은 문제가 발생할 수 있었다. 자바는 이러한 병렬 실행 환경을 쉽게 관리하고 에러가 덜 발생하는 방향으로 진화하려고 노력했다. 자바 1.0 : 스레드, 락, 메모리 모델 자바 5 : 스레드 풀, 병렬 실행 컬렉션 자바 7 : 포크/조인 프레임워크 이렇게 많은 프레임워크가 추가됐지만, 개발의 활용하기는 쉽지 않았다. 하지만 자바 8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용이라는 두 가지 요구사항을 기반으로 한다. 자바 8 : 스트림 API, 메서드에 코드를 전달하는 기법, 인터페이스의 디폴트 메서..

HTTP 정리 - 캐시와 조건부 요청

캐시(Cache) 개요 클라이언트가 서버에 자원을 요청할 때 자주 사용하는 데이터나 용량이 커서 서버의 비용 부담이 큰 경우 매 번 새로 다운로드하는 건 문제가 생길 수 있다. 캐시는 이런 자원들을 복사해서 브라우저 캐시에 저장해 두고, 자원이 변경하지 않았다면 브라우저 캐시에서 다시 사용할 수 있는 임시 저장소이다. 캐시 지시어 Cache-Control: max-age 캐시 유효 시간동안 브라우저 캐시에 있는 자원을 이용한다. (초 단위) Cache-Control: no-cache: 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용해야 한다. Cache-Control: must-revalidate 캐시 만료후 최초 조회 시 Origin 서버에 검증해야 한다. Pragma: no-c..

네트워크 2022.08.19

HTTP 정리 - 상태코드와 헤더

HTTP 상태 코드 클라이언트가 보낸 요청의 처리 상태를 응답 메시지로 돌려준다. 이 상태 코드를 통해서 서버의 상황을 추측할 수 있다. 1xx(informational) 요청이 수신되어 처리 중 (거의 사용하지 않는다) 2xx(Successful) 클라이언트의 요청을 성공적으로 처리 200 OK : 클라이언트의 요청이 성공적으로 응답됐을 때 201 Created: 요청이 성공하여 새로운 리소스가 생성될 때 생성된 리소스는 헤더에서 Location필드로 추가된다. 202 Accepted: 요청이 접수되었으나 처리가 완료되지 않을 때 Ex) 배치 처리가 이에 해당한다. 204 No Content: 요청이 성공했지만, 응답 페이로드 본문에 보낼 데이터가 없을 때 Ex) 아무 내용이 없어도 저장 버튼을 눌러도..

네트워크 2022.08.16

HTTP 정리 - 기본

HTTP(Hyper Text Transfer Protocol) HTPP 메시지에 거의 모든 형태로 데이터를 전송할 수 있다. HTML, TEXT IMAGE, 영상, 음성, File JSON, XML 기반 프로토콜 TCP: HTTP/1.1, HTTP/2 UDP: HTTP/3 현재는 HTTP/1.1을 주로 사용하는데, HTTP/2, HTTP/3도 점점 증가하는 추세이다. TCP 통신은 3 way handshake 때문에 신뢰성과 연결성은 보장하지만, 이 과정에서 속도가 떨어진다. 하지만 HTTP/3는 UDP 프로토콜을 사용(재설계) 하여 속도를 높일 수 있다. HTTP 특징 1. 클라이언트 서버 구조 클라이언트가 요청(Request)을 보내고 서버가 요청에 대한 결과를 만들어서 응답(Response)하는 구..

네트워크 2022.08.10

인터넷 네트워크 정리

인터넷 네트워크 웹이나 HTTP는 인터넷 네트워크 안에서 일어난다. 인터넷 망을 통해 두 컴퓨터가 통신하기 위해서 여러 노드를 거치는데, 이 요청을 전달하기 위한 방법이 IP(인터넷 프로토콜)이다. IP 인터넷 프로토콜 역할 지정한 IP 주소에 데이터 전달 패킷이라는 통신 단위로 데이터 전달 IP 패킷 정보 패킷 단위로 데이터를 전달한다. 즉, 전송 데이터와 클라이언트 IP, 서버 IP 등을 함께 묶어 패킷으로 만든 후 전달한다. IP 프로토콜의 한계 비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 비신뢰성: 중간에 패킷이 사라지거나 순서대로 도착하지 않을 수 있다. 프로그램 구분: 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면 혼동된다. TCP IP 프로토콜의..

네트워크 2022.08.04

스프링 핵심 원리 기본 - 빈 스코프

빈 스코프란 스프링 컨테이너는 컨테이너가 종료될 때까지 스프링 빈을 유지시킨다. 이것은 스프링 빈이 기본적으로 싱클톤 스코프로 생성되기 때문이다. 스코프는 빈이 존재할 수 있는 범위를 말한다. 빈 스코프의 종류 singleton: 스프링 loc 컨테이너당 하나의 인스턴스만 사용. (가장 넓은 범위의 스코프이다.) prototype: 매번 새로운 빈을 정의한다. (빈의 생성과 의존관계 주입까지만 관여하여 스코프의 범위가 매우 짧다) request: HTTP 라이프 사이클 마다 한 개의 빈을 생성 (웹 요청이 들어오고 나갈 때까지 유지) session: HTTP 세션마다 한 개의 빈을 생성 (웹 세션이 생성되고 종료될 때 까지 유지) application: ServeltContext 라이크프사이클 동안 한 ..

스프링 2022.08.02

스프링 핵심 원리 기본 - 빈 생명주기 콜백

빈 생명주기 콜백 애플리케이션 연결을 모두 종료하기 위해서는 객체의 초기화와 종료 작업이 필요하다. 스프링 빈은 객체를 생성하고 의존관계 주입이 끝난 다음에야 필요한 데이터를 사용할 수 있다. 따라서 초기화 작업은 의존관계 주입이 완료되고 난 다음 호출해야 한다. 스프링 컨테이너는 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점과 종료 시점을 알려준다. 콜백이란 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수이다. 스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 ⇾ 스프링 빈 생성 ⇾ 의존관계 주입 ⇾ 초기화 콜백 ⇾ 사용 ⇾ 소멸전 콜백 ⇾ 스프링 종료 라이프 사이클을 보면 의존관계 주입후 초기화 콜백 메서드 호출을 하여 초기화 시점을 알려주고,..

스프링 2022.07.28

스프링 핵심 원리 기본 - 의존관계 자동 주입

다양한 의존관계 주입 방법 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입한다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } }..

스프링 2022.07.26