목록전체 글 (58)
To Dare Is To Do!

로드밸런싱이란?간단히 설명하면 많은 트래픽이 발생할 때 서버가 부담하는 부하를 분산해주는 장치 혹은 기술입니다.로드밸런싱의 중요성오늘날의 웹 서비스는 다양한 이유로 인하여 단일 서버만으로 운영되기 어려운 경우가 많습니다. 사용자 수의 증가, 데이터 크기의 확장, 그리고 빠른 응답 속도에 대한 요구가 증가 등이 그 이유이며 이러한 이유들로부터사용자 경험을 보장하기 위해서 오늘날 분산 시스템(다중 서버) 구축은 필수로 자리 잡게 되었습니다.이렇게 서버가 분산된 환경에서 로드밸런싱은 트래픽을 여러 서버로 나누어 시스템의 안정성과 성능을 보장하는 핵심 기술로서 활약하고 있습니다. Nginx의 역할과 강점 Nginx는 단순한 웹 서버 역할을 넘어, 로드밸런싱, 리버스 프록시, 정적 콘텐츠 제공 등 다양한 기능을 ..

Nginx란?높은 성능과 안정성을 인정받아 최근 많이 사용되고 있는 웹 서버이다.Nginx라는 웹 서버가 정확히 어떠한 장점때문에 많이 이용되는지 알아보기 전에웹 서버가 무엇인지, 어떠한 요소들과 상호작용하는지 확인해보려고 한다. 보통의 웹 서비스는 클라이언트 -> 웹 서버 -> WAS(Web Application Server) -> DB 방향으로 요청이 진행되고 역순으로 응답 된다. 1. 클라이언트- 서비스를 이용하기 위해 네트워크에 요청을 보내주는 주체를 의미ex) 인터넷에서 특정 웹 페이지를 보기 위해 웹 브라우저를 실행하여 접속하는데 여기서 웹 브라우저가 클라이언트 역할을 맡는다.- 보통 웹 개발의 영역에서는 크롬, 사파리, 익스플로러 등의 웹 브라우저가 클라이언트의 역할을 맡음 2. 웹 서버- ..

Stream이란?Java 8부터 추가된 기술로 람다를 활용해 배열과 컬렉션을 함수형으로 간단하게 처리할 수 있는 기술이다. 특징람다식으로 요소 처리 코드를 제공한다.람다식을 사용함으로써 간결하고 명확한 문법으로 코드의 가독성을 높인다.List names = Arrays.asList("Tom", "Jerry", "Spike");names.stream() .filter(name -> name.startsWith("T")) .forEach(System.out::println); // Tom filter(name -> name.startsWith("T")): 람다식을 사용하여 이름이 "T"로 시작하는 요소를 필터링한다. forEach(System.out::println): 람다식을 사용하여 필터링..

thread pool미리 일정 개수 생성된 스레드를 생성하여 관리하는 기법→ 병렬 작업 처리가 많아지면 스레드 개수 증가로 인한 메모리 사용량 폭증으로 성능 저하를 관리하기 위함개념작업 요청 시 새로운 스레드 생성 대신 기존에 제한된 개수만큼 정해놓은 스레드로 작업을 처리→ 작업 큐에 들어오는 작업들을 하나씩 스레드가 처리사용 후 작업이 완료되면 해당 스레드는 다시 대기 상태로 돌아가고, 새로운 작업을 할당받을 준비장점자원 효율성스레드 재사용 : 스레드 풀은 작업이 끝난 스레드를 다시 사용하여 새로운 스레드를 생성하고 제거하는 비용을 줄임 스레드 생성과 소멸에는 상당한 자원이 소모되므로, 재사용을 통해 시스템 자원을 절약 가능최소화된 컨텍스트 스위칭: 스레드를 자주 생성하고 제거하면 컨텍스트 스위칭이 빈..
equals()어떤 두 참조 변수의 값이 같은지 다른지 동등 여부public boolean equals(Object obj) { return (this == obj);}재정의하지 않은 equals() 메서드는 호출한 객체와 전달된 객체의 내용이 같은지 확인하며 == 연산자를 사용해 동일한 참조를 가리키면 true를 반환함equals() 오버라이딩논리적 동등성을 비교하고자 할 때, equals()를 오버라이딩하여 객체의 특정 필드를 기준으로 비교@Overridepublic boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; ..
개요Java 에서 문자열을 다루는 대표적인 클래스로 연산이 많지 않을 때는 위에 나열된 어떤 동기화 방법을 사용하더라도 큰 문제가 발생할 가능성은 적으나 연산 횟수가 많아지거나 멀티스레드 환경에서 Race condition 등의 상황이 자주 발생한다면, 각 동기화 방법의 특징을 이해하고 상황에 맞는 적절한 방법을 사용해야 함String불변 객체로 한 번 생성되면 그 값을 변경할 수 없음더하기 연산을 하여 문자를 이어 붙일 때는 새로운 객체가 생성되어 재 할당됨public class StringExample { public static void main(String[] args) { String str = "Hello"; System.out.println(str.hashCod..
테스트 코드란?개발자에 의해 작성된 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드테스트 코드를 작성한다면!빠른 피드백개발자는 실제 코드를 작성 혹은 수정할 때 테스트 실행으로 인하여 즉각적인 피드백을 제공 받음코드에 버그가 있거나 변경 사항으로 인해 기존 기능에 문제가 생기는지 빠르게 확인 가능자동화새로운 요구 사항으로 기존 코드가 수정되어도 테스트 코드가 작성되어 있다면 처음부터 테스트를 실행할 필요 없음특정한 케이스를 직접 넣고 출력이나 로그를 살펴보는 수동 테스트보다 빠르게 문제를 식별하여 비용 절약이 가능안정성사람의 실수가 반영될 수 있는 수동 테스트로 인해 발생하는 불안정성 예방코드의 변경으로 인해 발생할 수 있는 의도치 않은 문제를 사전에 예방하여 안정성..

개요같은 모델의 두 핸드폰을 비교할 때 동등하다 혹은 동일하다는 의미에서 모두 같은 핸드폰이라고 할 수 있을까?동일하다 : 같은 고유 식별값을 가지고 있지 않아 동일하다고 할 수 없음동등하다 : 각자의 고유 식별 번호는 다르지만 같은 외형을 가지고 있어 동등하다고 할 수 있음개념동일성(identity)두 객체가 힙 메모리상에서 같은 위치(주소)에 있는지를 의미하며, 해시 코드 값(한 사람 당 하나의 값을 갖게 되는 식별값)을 비교해서 완전히 동일한 것인지 비교 (물리적)두 객체의 해시코드 값을 비교하는 방법으로 ==연산자로 비교했을 때 true라면 동일성이 같은 객체임Number number1 = new Number(1);Number number2 = number1;System.out.println(nu..

내가 사용하는 ec2 인스턴스의 메모리는 프리티어로서 상당히 제한적인 용량을 가지고 있다.이러한 환경 속에서 효율적으로 프로젝트를 진행하고 위해 메모리 설정을 해보려고 한다. 설정을 진행하기 전 서버의 메모리 용량 및 현재 사용되고 있는 사용량을 한번 살펴본다.ubuntu 서버의 메모리 사용량 조회메모리의 사용량을 확인하고 싶은 경우 "top"명령어를 입력하여 간단하게 확인할 수 있다.현재 동작중인 프로세스들의 목록과 해당 프로세스의 CPU와 메모리 사용을 보여준다. 현재 해당 서버에는 Spring boot 프로젝트가 올라가 있고 성능 테스트 진행 시에는 서버 자원의 모니터링을 위한 Jmeter agent가 메모리에 올라가 작동한다. 각각이 사용하는 메모리를 확인해 보자spring 프로젝트가 사용하고 있..
Call by value- 메서드를 호출할 때 넘겨줄 변수(인자)를 지정하면, 메서드의 매개변수가 지정한 변수 값의 복사본으로 초기화되는 것- 복사된 인자는 함수 안에서 지역적으로 사용되는 local value 속성을 가짐- 함수내에서의 변경은 메서드를 호출할 때 지정한 변수에 영향을 미치지 않음 Call by reference- 메서드를 호출할 때 넘겨줄 변수를 지정하면, 메서드의 매개변수가 지정한 변수의 래퍼런스로 초기화되는 것- 함수 내에서의 변경은 메서드를 호출할 때 지정한 변수에 영향을 끼침 Java는 Call by value or Call by reference?public class main{ public static void main(String[] args) { ..
좋아요 기능, 단순해 보여도 깊다‘좋아요’는 단순히 버튼 하나를 누르는 작고 직관적인 기능처럼 보이지만 이 짧은 상호작용 뒤에는 수많은 기술적 고민이 숨어 있습니다.데이터 정합성을 유지하며 좋아요 수를 빠르게 계산하고, 급격한 트래픽 증가와 다수 사용자의 동시 요청을 견디기 위해서는 조회 성능, 동시성 제어, 데이터 처리 방식에 대한 깊은 이해가 필요합니다.특히 오늘날 좋아요 수는 단순한 호감 표현을 넘어, 콘텐츠 노출, 상품 추천, 사용자 행동 분석 등 핵심 로직의 기준으로 작동합니다.즉, 좋아요는 이제 단순한 UI 기능이 아니라 비즈니스 흐름을 결정짓는 데이터의 시작점입니다.이 글은 제가 SNS 프로젝트에서 좋아요 기능을 설계하고 개선해온 과정을 정리한 기술 회고입니다.처음엔 단순한 INSERT-CO..

Jmeter란?서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구순수 Java 애플리케이션 오픈 소스서버, 네트워크에 대한 과부하를 시뮬레이션하여 강도를 테스트, 다양한 부하의 유형에서 전체 성능 분석할 때 사용특징다양한 프로토콜 및 서버를 테스트웹 : http, httpsSOAP / REST 웹 서비스FTP데이터베이스Mail 등CLI 지원CI 또는 CD 툴과 연동할 때 편리함UI를 사용하는 것보다 적은 시스템 리소스를 사용시나리오 기반 테스트 가능다양한 외부 플로그인을 사용하여 기능 확장 가능 ex) PerfMon : 서버의 상태를 모니터링하는 JMeter Plug inJmeter 활용 시 주요 개념Thread Group: 몇 개의 쓰레드가 동시에 요청을 보내는 지 확인Sampler: 어떤 유..
그 동안 몇 번의 프로젝트를 진행했지만 기능 구현에 중점을 두었을 뿐 프로젝트의 성능을 위한 고민을 한 적이 없었다.따라서 이번 프로젝트에서는 성능에 대해 좀 더 고민한 흔적을 남겨보려고 한다. 성능테스트는 왜 필요한가?1. 사용자의 만족도 측면웹 사이트 혹은 애플리케이션의 성능은 사용자의 만족도와 직결되는 요소로서 서비스 제공 시 많은 주의가 요구되는 부분이다.시스템의 응답 시간, 처리량, 안정성 등을 모니터링하여 사전에 문제를 발견하거나 부족한 부분을 개선해야 사용자에게 최적의 사용 경험을 제공할 수 있다. 2. 기업의 비용 측면성능 테스트를 통해 사용자의 만족도 뿐만 아니라 서비스에 어느 정도의 자원을 할당해야 하는 가에 대한 지표도 얻을 수 있어 서비스 제공자가 경제적인 선택을 할 수 있게 돕기도..

추상 클래스란?- 객체 명세의 역할을 맡아 실체 클래스의 공통적인 상태을 모아 규격화- 추상 메서드*를 하나 이상 포함한 클래스추상 메서드: 작동 로직 없이 즉 메서드의 선언부만 작성되어 구현부를 미완성으로 남긴 메서드로 자식 클래스에서 반드시 구현해야 한다. 추상 클래스의 특징- abstract 키워드를 붙여서 정의- 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스- new 키워드를 사용하여 직접 객체를 생성할 수 없다.- 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다.- 상속하는 집한 간 연관 관계가 있다. (is-a 관계)- 접근 제어자를 자유롭게 사용할 수 있다.- 추상클래스는 단일 상속만 지원한다.=> 여러 부모 클래스로부터 상속받을 때 발..

자바에서 데이터 타입은 크게 원시 타입과 참조 타입으로 나뉜다. 참조 타입 : 객체의 주소를 참조하는 타입, 메모리 주소 값을 통해 객체를 참조원시 타입 (Primitive Type)- 정적 메모리 영인 stack에 정수, 실수 , 문자, 논리 리터럴 등의 실제 데이터 값을 저장- 비객체 타입으로서 null 값을 가질 수 없음종류데이터형크기(byte / bit)표현 범위논리형boolean1 / 8true 또는 false문자형char2 / 16'\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터)정수형byte1 / 8-128 ~ 127정수형short2 / 16-32768 ~ 32767정수형int4 / 32-2147483648 ~ 2147483647( -21억 ~ + 21억)정수형long8 / ..

주제인 Checked Exception과 Unchecked Exception에 대해 알아보기 전에 Error과 Exception에 대해 간단히 확인해보려고 한다. Error- 프로그램 실행 중 발생하는 예기치 않은 문제로, 주로 시스템 수준에서 발생한다.- 발생 시점에 따라 3가지로 분류된다.컴파일 에러 - 컴파일 단계에서 오류가 발견되면 컴파일러가 에러 메시지를 출력한다.- 컴파일 에러의 대표적인 원인으로 syntax error가 있다.- 심각한 수준의 에러는 아님런타임 에러- 컴파일 과정에는 문제가 없었으나 프로그램 실행중 에러가 발생하여 잘못된 결과를 얻었거나 외부적 요인으로 인한 기계 결함으로 프로그램이 비정상적으로 종료된다.- 개발 과정에서 논리적이지 못한 설계로 인한 발생이 주요 원인- 런타..

이번 글에서는 지난 가시성의 문제와 volatile에 이어서 멀티 스레드 환경에서 발생할 수 있는 원자성의 문제에 대해 알아보려 한다. 원자성의 문제원자성이란?한 번에 하나의 단위 작업으로 간주되어야 하는 작업의 개념으로 여러 스레드가 동시에 공유자원에 접근할 때 더욱 고려되어야 하는 요소이다. 예를 들어 2개의 스레드가 동시에 count++ 연산을 100회 수행한다고 하자.우리는 count의 값으로 200을 기대하지만 원자성이 보장되지 않는 상황에서는 결과가 우리의 예상과는 다르게 나온다.원인을 찾아보면 count++ 연산은 READ - MODIFY - WRITE 3개의 instruction으로 구성된다.만약 1번 스레드가 값을 읽어 count + 1을 하기 전에 2번 스레드가 count를 읽어 cou..

여러 스레드를 활용하면 시스템의 자원 사용, 응답 시간, 문맥 교환 횟수를 줄이는 등의 장점을 얻을 수 있지만 데이터의 충돌 문제 즉 동시성을 보장할 수 없는 문제를 초래할 수 있다. CPU가 작업을 수행하기 위한 데이터를 읽을 때 RAM의 일부분을 CPU Cache Memory로 읽어들이고CPU가 작업에 대한 결과를 RAM에 저장할 때는 다시 CPU Cache Memory보내고 이들은 적절한 시점에 RAM으로 쓰기 작업을 수행한다.이러한 읽고 쓰는 과정에서 CPU Cache Memory들은 CPU가 읽거나 쓰는 작업을 수행했지만 효율성 및 일관성의 이유로 RAM에 해당 작업들을 바로 수행하진 않는다. 동시성 프로그래밍에서는 CPU와 RAM의 중간에 위치하는 CPU Cache Memory와 병렬성이라는 ..

자바의 메모리 구조는 크게 method(static) 영역, stack 영역, heap 영역으로 구성되어 있다.https://whitehartlane.tistory.com/24 자바 메모리 구조 (feat 자바 변수)이전에 자바의 컴파일 과정에 대해 정리해본 글을 살펴보면JVM의 클래스 로더는 자바 컴파일러가 컴파일한 클래스 파일(바이트 코드)를 동적 로딩의 과정을 통해여 JVM의 메모리(Runtime Data Area)에whitehartlane.tistory.com이 중 static영역과 heap 영역은 자바의 멀티 스레드 환경에서 스레드들끼리 공유되기 때문에 공유자원에 대한 동기화 문제를 고려해야 한다. 스레드 동기화위에서 말했 듯 멀티스레드 환경에서는 다른 스레드에 의해 공유자원의 값이 쉽게 변경될..

프로세스 (process)- 실행중인 프로그램*= 프로그램이 운영체제에 의해 메모리를 할당 받아 실행중인 상태- 프로그램에 사용되는 데이터와 메모리 등의 자원, 스레드로 구성됨 * 프로그램 : 파일이 저장장치에 저장되어 있으나 메모리에 올라가지 않은 정적인 상태스레드 (thread)과거 프로그램을 실행하면 시작부터 끝까지 프로세스 하나로 진행을 했으나 프로그램이 복잡해진 현재에는 프로세스 하나만으로 프로그램을 실행하기 힘든, 즉 프로그램 하나가 한 가지 작업만 하지 않는 상황이 되었다.프로세스는 운영체제의 안정성을 이유로 각자에게 할당된 메모리 내의 정보에만 접근할 수 있기 때문에 한 프로그램 안에는 여러 프로세스를 구성할 수 없다.프로세스와는 다른 더 작은 실행 단위의 개념이 요구되었고 이렇게 스레드가..