분류 전체보기 69

IoC 컨테이너 활용: 생성자 주입과 빈 조회 방식

객체의 불변성을 유지하기 위해 변수를 final로 선언하며, 해당 변수를 즉시 초기화하거나 생성자를 통해 주입하는 방식을 사용한다. 생성자 주입은 객체 생성 시점에 의존성을 명확히 하고, 테스트 용이성과 코드 가독성을 높이는 장점이 있다. @Autowired 어노테이션을 사용하면 IoC 컨테이너에 의해 관리되는 빈을 주입받을 수 있다. 하지만 자동 의존성 주입으로 인해 객체 간 명시적인 의존관계가 모호해질 수 있고, 반드시 스프링 IoC 컨테이너에서 관리되는 빈 클래스에만 사용이 가능하기 때문에 추천하지 않는 방식이다. 수동으로 직접 IoC 컨테이너에 접근해서 빈을 가져오는 방법을 살펴보자 ApplicationContext context : 빈 팩토리 등등의 클래스들을 상속받은 클래스. IoC 컨테이너라..

Jackson 이란?

Java에서 JSON을 처리하기 위한 라이브러리로, JSON 데이터의 직렬화(Serialization) 및 역직렬화(Deserialization)를 쉽게 수행할 수 있도록 도와준다. ObjectMapper : JSON과 Java 객체 간의 변환을 수행하는 클래스. writeValueAsString(), readValue()등의 메서드를 통해 JSON 데이터를 손쉽게 변환할 수 있다.// Jackson 라이브러리에서 제공하는 클래스.ObjectMapper obj = new ObjectMapper();// 객체형태의 값을 String으로 직렬화 한다.String json = obj.writeValueAsString(new User("이름", 20)); // User 클래스에는 Getter가 필요하다.Syst..

🖥️ Back-end 2025.03.05

동기(Sync)와 비동기(Async)란?

동기 : 만약 어떤 함수 X가 동기로 함수 Y를 호출하면, X는 Y의 작업이 완료될 때까지 기다려야하는 순차적인 진행이다.비동기 : 함수 X가 비동기로 함수 Y를 호출하면, X는 Y의 작업을 신경쓰지 않고 따로 동작하는 병렬적인 진행이다. Spring에서는 기본적으로 동기적으로 처리되지만, 비동기가 필요한 경우에는 @Async 어노테이션을 사용하여 구현할 수 있다. 동기 ▼@GetMapping("/task")public String syncTask() throws InterruptedException { System.out.println("동기 작업 시작"); Thread.sleep(3000); // 3초 동안 대기 System.out.println("동기 작업 완료"); retur..

RabbitMQ 란?

대규모 시스템에서 수배만 명의 사용자가 동시에 접속하고 상호작용할 수 있는 시스템을 구축해야 하는 상황에서 안정성과 신뢰성을 유지하면서 고성능을 제공해야 한다.카톡이나 라인 같은 메시징 시스템을 개발한다고 했을 때, 사용자 수를 고려해서 초당 요청량을 생각해 보자, 시스템 모니터링을 통해 하루에 몇 명의 사용자가 접속하는지 알 수 있다. 그중에서 제일 높은 피크의 범위를 견딜 수 있게 애플리케이션을 개발해야 한다. Queue를 통해서 대규모 스트림 처리를 할 수 있는데, 이번에는 RabbitMQ에 대해 학습해 보았다. Queue : 선입선출(First In, First Out, FIFO) 구조를 따르는 선형 자료구조입니다. 먼저 들어간 데이터가 먼저 나오는 방식으로 동작하며, 일상생활에서 줄을 서는 느낌..

🖥️ Back-end 2025.03.04

Redis 기본 문법 알아보기

인메모리 저장소와 Redis 란? - Redis Stack 설치MySql, Oracle 등 관계형 데이터베이스는 테이블의 형태로 데이터를 저장한다. 서비스가 종료가 되어도 데이터베이스의 데이터는 계속 남아있는 영속성, 항상 일관된 데이터를 유지하는 일관성이seungg8361.tistory.com Redis가 설치가 완료되었다면, 문법을 테스트해 보자-- String-- Map-- SET -> 문자열 자료형을 의미-- GET -> 문자열 자료형을 가져온다 -> 문자열 데이터를 반환-- user:email -> key 의 역할-- .... ex) SET user:email alex@example.comGET user:email-- key 이름 변경RENAME user:email user:emails--..

🖥️ Back-end 2025.03.03

인메모리 저장소와 Redis 란? - Redis Stack 설치

MySql, Oracle 등 관계형 데이터베이스는 테이블의 형태로 데이터를 저장한다. 서비스가 종료가 되어도 데이터베이스의 데이터는 계속 남아있는 영속성, 항상 일관된 데이터를 유지하는 일관성이 있다. 파일 시스템 HDD, SSD에 데이터를 저장하는 데이터베이스이다.파일 시스템에 저장하고 관리하는 것은 상대적으로 느릴 수밖에 없다. H2는 인메모리 옵션이 있어서 인메모리 상에 관계형 데이터베이스를 테이블로 만들기도 하지만 파일 시스템에 저장하지는 않는다. Redis는 인메모리다. 한마디로 메모리 상에 올라간다는 뜻이다. 즉, 프로그램이 종료되면 데이터가 모두 사라지게 된다.하지만 메모리(RAM)는 휘발성이므로, 자주 사용하고 자주 쓰이는 데이터를 저장하기 좋다. 세션, 장바구니, 조회수 상황에 따라서 자..

🖥️ Back-end 2025.03.01

GitLab 이란?

소프트웨어 개발 및 협업을 위한 통합 DevOps 플랫폼으로, Git 저장소 관리부터 지속적 통합 및 배포, 이슈 추적, 코드 리뷰 등 소프트웨어 개발의 모든 단계를 하나의 플랫폼에서 지원한다.이는 개발팀이 효율적으로 협업하고, 프로젝트의 전 과정을 효과적으로 관리할 수 있도록 도와준다. Git과 비슷한 기능들이 있으며, 주요기능으로 파이프라인 : CI/CD를 통해 코드가 커밋될 때마다 자동으로 빌드, 테스트, 배포 과정을 실행.자동화 : 테스트 자동화, 코드 품질 검사, 배포 자동화 등을 통해 개발 사이클을 단축하고 오류를 줄인다.모니터링 : 배포된 애플리케이션의 상태를 모니터링하고, 문제 발생 시 신속하게 대응한다.실제로 Github을 사용해서 협업 하듯이 Gitlab을 활용해서 PR, merge 등..

Docker 제대로 시작하기

컨테이너는 Docker 이미지를 실행한 상태입니다. 이미지가 정적인 템플릿이라면, 컨테이너는 실제로 애플리케이션이 실행되는 동적인 환경입니다.컨테이너는 격리된 공간에서 애플리케이션을 실행하며, 필요한 모든 의존성을 포함합니다.하나의 시스템에서 여러 개의 컨테이너를 독립적으로 실행할 수 있습니다.docker run -d --name postgres-sample \-p 5433:5432 \-e POSTGRES_USER=admin \-e POSTGRES_PASSWORD=admin \-e PGDATA=/var/lib/postgresql/data/pgdata \-v /home/bsg/sample1:/var/lib/postgresql/data:z \postgres-d : 백그라운드에서 실행-name : 컨테이너 이..

Pageable을 알아보자

데이터베이스에 수천 건이나 수만 건의 데이터가 존재할 때, 모든 데이터를 한꺼번에 조회하여 클라이언트로 전송하는 것은 네트워크 부하를 증가시키고, 애플리케이션의 성능 저하를 발생시킬 수 있다.  이러한 문제를 피하기 위해 페이징(Paging) 기법을 사용하여 필요한 데이터만 일정한 크기로 나누어 조회하고 전송함으로써 네트워크 트래픽을 최적화할 수 있다.  페이징을 사용하는 예시 ▼ @GetMapping("/products") public Page getProducts( // 페이지, 사이즈, 정렬, 오름차순 @RequestParam("page") int page, @RequestParam("size") int size, ..

QueryDSL 이란?

하이버네이트 쿼리 언어의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크로, 자바 백엔드에서 Spring Data JPA를 함께 사용한다. 하지만 JPA로 복잡한 쿼리, 동적 쿼리를 구현하는데 한계가 있기 때문에 이를 해결할 수 있는 것이 QueryDSL 이다.Mybatis, JPQL 등 문자열 형태로 쿼리문을 작성하여 컴파일 시에 오류를 발견하는 것이 불가능했지만, QueryDSL은 자바 코드로 SQL문을 작성할 수 있기 때문에 컴파일 시에 발생하는 오류를 확인할 수 있다. 예를 들어서 복잡한 검색 조건이 있다고 가정해보자public interface MemberRepository extends JpaRepository { // 이름이 포함되고, 특정 나이 이상이며, 특정 지역에 사는 활..