-
Spring Boot로 주기적인 작업 수행하기 - Scheduled, Spring Batch 비교 TOP NEW
들어가며 이번 프로젝트에서 맡게 된 문자 기능의 요구사항으로 특정 시간에 자동으로 고객에게 문자를 발송하기가 있었습니다. 이 기능을 구현하면서 Spring boot에서 주기적으로 일정한 기능을 실행하도록 구현하는데에 여러 방법이 있다는걸 알게되었는데요, 이 글에서는 Scheduled, Spring Batch를 비교하며 각각의 특징을 간단하게 소개하려고 합니다 🙂 1. @Scheduled (Spring 기본 스케줄링) Spring Boot에서 기본 제공하는 스케줄링 기능으로, 간단한 주기적 작업을 처리할 때 유용합니다. 애플리케이션이 실행 중일 때만 동작하며, 단순한 반복 작업을 수행합니다. 특징 ... Read More
-
Race Condition 해결기: 트랜잭션 커밋 이후 알림 전송 보장하기 TOP NEW
Race Condition 해결기: 트랜잭션 커밋 이후 알림 전송 보장하기 📚 목차 문제 상황 개요 시스템 처리 흐름과 구조 증상: 알림이 먼저 저장이 나중 원인 분석: 비동기 처리와 트랜잭션 미보장 해결 전략 1: CompletableFuture를 이용한 체이닝 해결 전략 2: 트랜잭션 커밋 이후 후처리 개선 코드 비교 회고 및 실무 팁 1. 문제 상황 개요 고객 문의 폼이 제출되면, 내부 알림(Notification)과 이메일 전송이 함께 이뤄지도록 만들었어요. 이메일은 @Async로 비동기로 보내고, SSE는 즉시 알림을 쏘는 구조였는데요. 운영 중에 알림이 안 보이... Read More
-
실시간 통신의 세 가지 방식: Polling, SSE, WebSocket 비교와 SSE의 활용 TOP NEW
실시간 통신의 세 가지 방식: Polling, SSE, WebSocket 비교와 SSE의 활용 실시간 데이터 통신은 사용자 경험을 향상시키기 위한 핵심 기술 중 하나입니다. 특히 웹 애플리케이션에서는 클라이언트가 서버로부터 “실시간”으로 정보를 받아야 하는 경우가 많습니다. 대표적인 예는 다음과 같습니다. 실시간 알림 실시간 채팅 실시간 위치 추적 이러한 기능을 구현하기 위해 주로 사용되는 세 가지 방식이 있습니다: Polling (폴링) SSE (Server-Sent Events) WebSocket 이 세 가지 방식의 차이를 비교하고, SSE를 중심으로 어떤 상황에서 적합한지... Read More
-
JDBC부터 @Transactional까지 TOP NEW
JDBC의 등장 JDBC가 표준화되기 전에는 벤더별 드라이버를 직접 다루거나, ODBC 같은 타 언어 기반 인터페이스를 우회해서 DB에 접근했다. 그로 인해 생기는 문제점으로는, 데이터베이스를 다른 종류로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다는 점이 있다. 또한 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 그리고 그 결과를 응답받는 방법을 새로 학습해야 한다. 즉, 표준적인 방법으로 SQL 실행이 어렵다. 이런 배경 속에서 자바 개발자들이 DB를 일관되게 접근할 수 있도록 하는 표준이 필요하게 되었고, 그 결과로 등장한 것이 JDBC이다. JDBC는 자바... Read More
-
QueryDSL을 활용한 조건 기반 검색 기능 구현기 TOP NEW
🔍 들어가며 프로젝트를 개발하면서 단순한 전체 조회가 아닌, 사용자의 입력에 따라 동적으로 조건을 조합해 검색하는 기능이 필요했습니다. 이 글에서는 QueryDSL을 활용하여 복잡한 조건 기반 검색 기능을 어떻게 구현했는지에 대해 설명합니다. BooleanBuilder와 Pageable, 정렬, 조건 조합에 대한 실용적인 내용을 담고 있습니다. 🧩 QueryDSL이란? QueryDSL은 Java 코드로 SQL과 유사한 타입 안전한 쿼리를 작성할 수 있게 도와주는 라이브러리입니다. 기존 JPA의 Criteria API보다 훨씬 간결하고 가독성이 높으며, IDE의 자동 완성과 컴파일 타임 에러 방지 등의 장점... Read More
-
JWT 인증 시스템에서 Redis 활용하기 TOP NEW
[6주차] 로그 시스템 고도화 (feat. 비동기 Logstash 파이프라인) 5주차에는 프론트엔드 작업하느라 글을 쓸 만한 주제도 없었고, 시간도 없었다. 그래도 이번 주 수요일까지는 프론트를 마무리하고 로그 쪽 고도화할 시간이 있었고, 오랜만에 행복 개발 했다. 기술 블로그 글을 어떤 형식으로 작성해야 할지 아직도 고민이다. 많은 독자를 상정하고 입니다체를 사용하며 내용을 추상화하여 작성할지 지금처럼 회고성으로 이다체를 사용하며 어느 정도 구체적으로 작성할지 최근에 후자로 작성한 기술 블로그 글을 보는데 깊이도 있고 사고 과정이 잘 느껴져서 좋았던 것 같다. 그래서 이번 글은 후자로 작성해보려... Read More
-
Logback 설정과 활용 TOP NEW
Logback 설정과 활용 개요 로그는 애플리케이션의 동작 상태를 파악하고, 문제를 추적하며, 성능을 측정하는 데 중요한 도구입니다 Logback은 Spring Boot에서 기본으로 사용하는 로깅 프레임워크로, log4j보다 빠르고 유연한 구성을 지원합니다 따라서 Spring Boot에서 Logback을 설정하고 활용하는 방법에 대해 예제를 중심으로 설명하겠습니다 Logback이란? Logback은 SLF4J(Simple Logging Facade for Java)와 함께 사용하는 고성능 로깅 프레임워크입니다 Spring Boot의 기본 로깅 프레임워크 XML 또는 Groovy 기반 설정 지원 다... Read More
-
JDBC, Hibernate, JPA 그리고 ORM TOP NEW
JDBC 자바 언어로 데이터베이스 프로그래밍을 하기위한 라이브러리 DB에 직접 SQL을 실행하는 저수준 API jdbc를 매번 로딩해줘야하고 예외처리를 너무 많이 설정 해주어야함 -> JPA가 나옴 import java.sql.*; public class JDBCDemo { public static void main(String[] args) { try { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"); ... Read More
-
GitHub actions TOP NEW
GitHub Actions + ECR + EventBridge + Lambda를 활용한 무중단 ECS 배포 자동화 📝 개요 운영 중인 실시간 차량 관제 시스템의 백어드 서버를 무중단으로 배포하기 위해, CI/CD 파이프라인을 재설계했습니다. 기존에는 GitHub Actions에서 직접 ECS로 배포 요청을 보내는 방식이었지만, 이를 AWS 서비스 중심의 이벤트 기반 구조로 전환해서 안정성과 확장성을 개정했습니다. 이번 글에서는 GitHub Actions → Docker Build & Push to ECR → EventBridge → Lambda → ECS Force Deploy 순서로 이루어진 자동화 ... Read More
-
젠킨스에서 GitHub Actions로의 전환: 현대적 CI/CD 트렌드 TOP NEW
들어가며 소프트웨어 개발 환경에서 CI/CD(지속적 통합과 지속적 배포)는 현대 애자일 방법론의 핵심 요소로 자리 잡았습니다. 지난 10년간 CI/CD 도구의 대표주자였던 젠킨스(Jenkins)는 많은 개발 팀에 안정적인 파이프라인을 제공해 왔습니다. 하지만 최근 들어 GitHub Actions가 빠르게 성장하며 많은 팀이 젠킨스에서 GitHub Actions로 전환하는 추세를 보이고 있습니다. 이 글에서는 이러한 전환의 배경과 GitHub Actions의 장점, 그리고 실제 전환 전략에 대해 알아보겠습니다. CI/CD 도구의 진화: 젠킨스에서 GitHub Actions로 젠킨스의 시대 젠킨스는 2011년 ... Read More
-
엘라스틱서치 TOP NEW
스프링 프로젝트에서 Elasticsearch로 태그 기반 매물 추천 시스템 구현하기 목차 Elasticsearch 소개 Elasticsearch의 장단점 검색 동작 원리 스프링 부트에 Elasticsearch 연동하기 태그 기반 매물 추천 시스템 구현 마무리 Elasticsearch 소개 Elasticsearch는 Lucene 기반의 오픈소스 분산형 RESTful 검색 및 분석 엔진입니다. 대용량 데이터를 거의 실시간(Near Real-Time)으로 저장, 검색, 분석할 수 있는 기능을 제공합니다. JSON 기반의 문서를 저장하고 검색할 수 있으며, 복잡한 쿼리와 집계를 통해 데이터로... Read More
-
프로젝트 경험을 통해 다시보는 인증과 인가 — 로컬스토리지에서 HttpOnly 쿠키, 그리고 리프레시 토큰까지 TOP NEW
프로젝트 경험을 통해 다시보는 인증과 인가 — 로컬스토리지에서 HttpOnly 쿠키, 그리고 리프레시 토큰까지 시작: 모든 서비스는 인증과 인가로부터 시작된다 어떤 웹 서비스든 사용자의 로그인과 권한 관리는 핵심 기능이다. 사용자 정보를 안전하게 식별하고, 허용된 범위 내에서만 동작하게 만들기 위해선 반드시 인증(Authentication)과 인가(Authorization)의 개념을 명확히 이해하고, 설계에 반영해야 한다. 인증: 사용자가 누구인지 확인하는 절차 인가: 인증된 사용자가 어떤 자원에 접근할 수 있는지 결정하는 절차 서비스의 보안성, 확장성, 사용자 경험은 이 두 개념 위에서 결정된다... Read More
-
JWT 인증 시스템에서 Redis 활용하기 TOP NEW
[Redis #2] JWT 인증 시스템에서 Redis 활용하기 Refresh Token 보안 구조 설계와 구현 1. 들어가며 JWT 기반 인증 시스템에서 Refresh Token 관리는 보안성과 사용자 경험의 핵심 요소입니다. 특히 다중 인스턴스 환경이나 서버 측 토큰 제어가 필요한 경우, 토큰 저장소의 도입이 중요합니다. Redis를 활용한 화이트리스트 방식 Refresh Token 관리 구조와 Spring Boot로의 실제 구현을 설명합니다. 2. 왜 서버가 토큰을 저장해야 할까? JWT는 기본적으로 Stateless하며, 서버는 토큰 검증만 수행합니다. 하지만 다음과 같은 요구사항이 있... Read More
-
Redis 아키텍처 기초 TOP NEW
Redis 개념과 고가용성 아키텍처 정리 Redis란? Redis(Remote Dictionary Server)는 이름 그대로 원격에서 사용할 수 있는 사전(Dictionary) 형태의 자료구조 서버입니다. Key-Value 데이터 구조를 기반으로 다양한 형태의 자료구조를 지원하며, 인메모리 기반의 NoSQL 데이터 저장소입니다. 주요 특징 메모리 기반 저장으로 매우 빠른 데이터 접근이 가능합니다. 다양한 자료구조 지원: String, List, Set, Sorted Set, Hash, Bitmap, HyperLogLog, Geospatial 등 다양한 활용 사례: 캐시(Ca... Read More
-
ORM, SQLMapper, JDBC TOP NEW
주제: JDBC, ORM, SQLMapper 1. JPA란 무엇인가요? 객체 지향 프로그램에서 객체의 상태는 메모리에만 존재하며 프로그램 종료 시 사라집니다. 이 상태를 영속화(persistence)하려면 JDBC, SQLMapper 등을 사용해야 합니다. 그렇다면 JPA는 정확히 무엇일까요? JPA (Java Persistence API) 자바 객체와 데이터베이스 사이의 ORM(Object-Relational Mapping)을 지원하는 표준 인터페이스입니다. 쉽게 말해, “자바 객체를 데이터베이스 테이블처럼 다룰 수 있게 해주는 기술”입니다. 2. JDBC란? JDBC(Java Databa... Read More
-
MessageBroker TOP NEW
메시지 브로커(Message Broker), 알고 쓰자! 비동기 시스템을 연결하는 보이지 않는 연결고리 마이크로서비스, 실시간 알림, 주문 처리 시스템, IoT… 이런 키워드들 속에서 빠지지 않고 등장하는 개념이 바로 “메시지 브로커(Message Broker)”입니다. 이름은 들어봤는데, 정확히 무슨 역할을 하는지 감이 잘 안 오신다고요? 이 글에서는 메시지 브로커의 핵심 개념부터 종류, 장단점까지 한 번에 정리해보겠습니다. 💬 메시지 브로커란? 메시지 브로커는 시스템 간 메시지를 비동기 방식으로 주고받을 수 있도록 중간에서 중계해주는 역할을 합니다. 이를 가능하게 해주는 미들웨어를 MOM(Message... Read More
-
이진 탐색 알고리즘 TOP NEW
-
트랜잭션 완전 정복: DB부터 Spring까지 TOP NEW
트랜잭션이란? 트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적 작업 단위를 말합니다. 여러 개의 쿼리가 묶여 하나의 작업처럼 실행되며, 모두 성공하거나 하나라도 실패하면 전체가 취소되어야 하는 특성을 가집니다. 대표적인 예로 은행 이체가 있습니다. 트랜잭션의 기본 목적은 데이터의 일관성 유지입니다. ACID란? 트랜잭션이 만족해야 할 네 가지 특성입니다. Atomicity (원자성) 모든 작업은 전부 성공하거나 전부 실패해야 한다. Consistency (일관성) 트랜잭션 전후의 데이터 상태는 항상 일관돼야 한다. Isolation (격... Read More
-
정적팩토리메소드 TOP NEW
🧭 Java에서 객체를 생성할 때, 왜 정적 팩토리 메서드를 선택할까? Java에서는 객체를 생성하는 방식으로 @Setter, @Builder, 그리고 정적 팩토리 메서드(Static Factory Method) 등이 존재합니다. 많은 개발자들이 Lombok의 @Setter나 @Builder를 선호하지만, 저는 정적 팩토리 메서드를 더 선호합니다. 단순한 스타일의 문제가 아니라, 객체의 안정성, 일관성, 유지보수성을 고려한 실무적인 선택입니다. 이 글에서는 그 이유를 정리하고, 각 방식의 장단점을 비교해보겠습니다. 📚 목차 Entity에서 Setter, Builder를 지양해야 하는 이유 ... Read More
-
스프링 이벤트를 활용한 비동기 처리 방법 (ex. 프로젝트 생성 횟수 통계) TOP NEW
SODA 프로젝트: 스프링 이벤트와 비동기 처리로 프로젝트 생성 통계 구현하기 SODA 프로젝트를 진행하면서, 사용자들이 생성한 프로젝트의 추이를 그래프로 보여주는 기능을 위한 API 개발이 필요했습니다. 이 기능을 구현하기 위해 두 가지 접근 방식을 고민했습니다. 실시간 DB 전체 조회: 요청 시마다 실제 프로젝트 DB를 전체 조회하여 생성일 기준으로 카운트. 스프링 배치 활용: 일괄 처리를 통해 통계용 테이블을 별도로 생성하고, 하루 한 번씩 카운트 저장. 첫 번째 방법은 데이터가 많아질수록 심각한 성능 저하를 유발할 것이 뻔했기에 고려 대상에서 제외했습니다. 처음에는 두 번째 방법, 즉 스프링... Read More
-
커넥션 풀과 부하테스트 TOP NEW
커넥션 풀과 부하테스트 안녕하세요. kernel360 4기 오승택입니다. 이번 글에서는 커넥션과 커넥션 풀에 대한 기본적인 이해, 커넥션 풀 사이징 전략, 부하테스트를 통한 지표 분석 및 성능 최적화 경험을 공유하고자 합니다. 1. 커넥션이란? 애플리케이션에서 커넥션(Connection)은 클라이언트(애플리케이션)와 데이터베이스(DB) 사이의 네트워크 채널을 의미합니다. 이 채널을 통해 SQL 쿼리를 전송하고 결과를 수신하며, 트랜잭션 경계를 관리합니다. 이것은 근본적으로 네트워크 연결이므로 연결 시마다 소켓 생성, 핸드셰이크 등의 기본적인 TCP 연결 과정이 필요합니다. 커넥션이 일으키는 문제 a... Read More
-
springBean TOP NEW
스프링과 싱글톤 패턴 목차 들어가며 싱글톤 패턴이란? 스프링과 싱글톤 스프링이 싱글톤을 관리하는 방식 싱글톤 패턴의 단점과 스프링의 해결책 주의해야 할 점 마치며 1. 들어가며 스프링 프레임워크의 핵심 기능 중 하나는 애플리케이션 컨텍스트를 통한 빈(Bean) 관리입니다. 스프링은 기본적으로 모든 빈을 싱글톤(Singleton)으로 관리합니다. 이게 무슨 의미일까요? 그리고 왜 스프링은 빈을 싱글톤으로 관리할까요? 2. 싱글톤 패턴이란? 먼저 싱글톤 패턴이 무엇인지 알아보겠습니다. 싱글톤 패턴은 소프트웨어 디자인 패턴 중 하나로, 어떤 클래스의 인스턴스가 오직 하나만 생성... Read More
-
스프링배치 TOP NEW
Spring Batch 실전 사용기 – 대용량 데이터를 안전하게 처리하는 법 “서버가 뻗지 않으면서도, 수십만 건의 데이터를 정해진 시간에 처리할 수 있을까?” 대용량 데이터를 안전하게 처리해야 하는 순간은 생각보다 자주 찾아온다. 나 역시 차량 관제 시스템에서 하루 수만 건씩 쌓이는 로그를 집계하고, 이를 정기적으로 통계 테이블로 이관하는 작업을 맡으며 Spring Batch를 실무에 도입했다. 이 글에서는 내가 직접 Spring Batch를 실전에 적용하며 배운 점, 주의할 점, 그리고 성능까지 모두 공유한다. Spring Batch 실전 사용기 – 대용량 데이터를 안전하게 처리하는 법 “... Read More
-
Security에 대하여 TOP NEW
Security에 대하여 Security란 무엇인가 Spring Security는 스프링에서 제공하는 인증/인가 처리 전용 보안 프레임워크입니다. 주요 역할 인증(Authentication): 이 사용자가 누구인가? 인가(Authorization): 이 사용자가 이 기능을 사용할 권한이 있는가? 로그인 처리 (세션 or 토큰) URL, 메서드, 도메인 기반 권한 제어 비밀번호 암호화 및 검증 세션 관리, 로그아웃, CSRF 방어 OAuth2 (카카오, 구글 등 소셜 로그인) 필터 체인 기반의 보안 처리 Security를 사용하는 이유 security없이 직접... Read More
-
Redis : 핵심 개념부터 실전 적용까지 TOP NEW
Redis 정복: 핵심 개념부터 실전 적용까지 1. 들어가며 Redis는 대표적인 In-Memory Key-Value 저장소입니다. 빠른 속도와 다양한 데이터 구조를 제공하며, 실시간 데이터 처리, 인증 시스템, 캐싱, 세션 저장 등 다양한 분야에서 활발히 사용됩니다. 이 글에서는 Redis의 핵심 개념부터 실무에 적용하기 위한 실전 예제, 성능 고려사항, 확장 도구까지 체계적으로 정리합니다. 2. In-Memory Database란? In-Memory Database는 데이터를 디스크가 아닌 메모리(RAM)에 저장하는 방식의 데이터베이스입니다. 전통적인 RDBMS보다 훨씬 빠른 속도를 제공하지만, 메모리 ... Read More
-
RabbitMQ의 기초 개념 TOP NEW
RabbitMQ란? RabbitMQ는 메시지를 Producer로부터 Consumer에게 전달하는 메시지 브로커입니다. 애플리케이션 간 통신을 비동기적으로 처리할 수 있도록 도와주는 시스템으로서, 다양한 언어와 플랫폼에서 사용할 수 있는 AMQP(Advanced Message Queuing Protocol)를 기본적으로 사용하지만, STOMP, MQTT, HTTP 등을 포함한 다양한 프로토콜을 지원합니다. 왜 RabbitMQ가 필요할까? 모노리스 시스템에서는 한 컴포넌트가 다른 컴포넌트의 응답을 직접 기다려야 하므로 동기적 결합이 강합니다. 반면, RabbitMQ를 사용하면 메시지를 큐에 적재해 두고 비동... Read More
-
Presigned URL을 통한 파일 업로드 TOP NEW
주제: Presigned URL을 통한 파일 업로드 1. Presigned URL방식이란 Presigned URL은 서버에서 인증된 임시 업로드 링크를 생성해 클라이언트에 전달하고, 클라이언트가 직접 외부 스토리지(예: AWS S3)에 파일을 업로드할 수 있도록 해주는 방식입니다. 2. Vivim프로젝트에서 썼던 기존의 파일 업로드 방식 @PostMapping(path = "/posts/{postId}/file/stream", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @Opera... Read More
-
이커머스 DB 스키마 구성 전략: Olist 사례 분석 TOP NEW
이커머스 DB 스키마 구성 전략: Olist 사례 분석 들어가며 오늘은 이커머스 서비스에서 DB 스키마를 효과적으로 구성하는 전략에 대해 알아보겠습니다. 특히 브라질의 대표적인 이커머스 기업 Olist의 데이터셋을 통해 실제 운영 환경에서 사용되는 스키마를 살펴보고, 확장성과 성능 최적화를 위한 전략을 논의하겠습니다. 단순히 ‘이런 스키마가 정답이다’라는 식의 접근이 아닌, 실제 서비스가 성장하면서 어떻게 모놀리스에서 MSA로 전환해 나갈 수 있는지, 성능 병목을 어떻게 해결할 수 있는지에 초점을 맞추어 설명하겠습니다. Olist 이커머스 데이터셋 개요 Olist 데이터셋은 브라질 최대 이커머스 마켓플레이... Read More
-
데이터베이스 격리 수준 TOP NEW
-
스프링 부트에서 대용량 엑셀 업로드 검증 전략: 서비스 레이어 vs Argument Resolver TOP NEW
스프링 부트에서 대용량 엑셀 업로드 검증 전략: 서비스 레이어 vs Argument Resolver 유효성 검증의 중요성과 문제점 이번 프로젝트를 진행하던 중 다수의 고객 정보를 하나의 엑셀파일로 업로드해 고객을 생성하는 API를 개발하게 되었는데, 고객은 전화번호나 이메일 같은 Validation이 필요한 부분이 있어 유효성 검증을 어떻게 할지에 대해 고민을 하게 되었습니다. 그래서 오늘은 스프링 부트에서 엑셀 파일 업로드 시 발생하는 유효성 검증 문제와 해결 방법에 대해 이야기해보려고 합니다. 유효성 검증은 애플리케이션의 비즈니스 로직이 올바르게 동작하기 위해 데이터를 사전에 검증하는 필수적인 작업입니다.... Read More
-
인증과 인가, 그리고 JWT에 대하여 TOP NEW
-
코린이의 소프트웨어 설계와 아키텍처 패턴 감 잡기: 우리는 어떤 뼈대 위에 코드를 쌓고 있는 걸까? TOP NEW
코린이의 소프트웨어 설계와 아키텍처 패턴 감 잡기 부제: 우리는 어떤 뼈대 위에 코드를 쌓고 있는 걸까? 글을 쓰게 된 계기: JPA를 공부하다가 영속 계층(Persistence Layer)에 흥미를 느끼면서 “우리가 짜는 코드 구조의 근간은 뭘까?”라는 의문이 생겼습니다. 글을 쓰는 목표: 기능 구현도 벅찬 코린이에게 설계는 너무 먼 이야기일 수 있지만, 이번 시간의 목표는 그 질문을 따라 소프트웨어 설계, 아키텍처, 그리고 그 패턴들까지.. 개념은 들어봤다는 수준까지의 학습을 목표로 작성했습니다. 소프트웨어 설계부터 개발까지, 패턴의 유용성 무작정 짓는 건물은 무너지기... Read More
-
AOP를 활용한 로깅 처리 TOP NEW
AOP를 활용한 로깅 처리 개요 서비스 규모가 커질수록 로그 기록, 인증 처리, 예외 처리처럼 반복되는 코드가 여기저기 중복됩니다. 이런 공통 로직을 매번 메서드마다 작성하다 보면 코드가 지저분해지고 유지보수도 어려워집니다. 이런 중복 코드들을 AOP (Aspect-Oriented Programming) 를 사용하여 관리할 수 있습니다. AOP는 핵심 비즈니스 로직은 그대로 두고, 반복되는 부가 로직은 따로 분리해서 깔끔하게 관리할 수 있게 도와줍니다. 따라서 Spring Framework에서 AOP를 활용해 로깅을 처리하는 방법을 예제로 설명하겠습니다. AOP란? AOP는 핵심 비즈니스 로직과 공통 관심... Read More
-
Lower Bound & Upper Bound란? TOP NEW
Lower Bound & Upper Bound란? Lower bound & Upper bound는 특정 경계 값을 찾는 알고리즘이다. 이진 탐색을 기반으로 하기 때문에 정렬된 데이터에서만 사용할 수 있다. 시간 복잡도는 이진 탐색과 같은 O(log n)이다. Lower Bound 특정 값의 시작 위치를 찾는 알고리즘 찾고자 하는 값이 존재하면 그 값의 첫 번째 위치를 반환 찾고자 하는 값이 없으면 해당 값이 들어갈 수 있는 첫 번째 위치를 반환 아래 사진에서 3의 Lower bound는 3(index)이다. 동작 방식 left: 배... Read More
-
CORS 에러, 이제 두렵지 않다! (원리부터 Spring Boot 해결까지) TOP NEW
CORS 에러, 이제 두렵지 않다! (원리부터 Spring Boot 해결까지) 안녕하세요! 웹 개발 여정에서 우리를 종종 멈칫하게 만드는 CORS(Cross-Origin Resource Sharing) 에러. API는 멀쩡한데 브라우저 콘솔에 빨간 불이 들어오면 당황스럽기 마련이죠. 😥 프론트엔드와 백엔드가 분리된 현대 웹 아키텍처에서는 다른 출처(Origin) 간의 통신이 필수적입니다. 하지만 브라우저의 보안 정책인 SOP(Same-Origin Policy) 때문에 이 과정이 기본적으로 차단됩니다. 바로 이 지점에서 CORS가 등장합니다! 이 글에서는 CORS 에러가 왜 발생하는지(SOP), CORS는 어떻... Read More
-
queryDSL 알아보기 TOP NEW
JPA, JPQL, 그리고 QueryDSL — 타입 안정성과 유지보수를 위한 진화 현대 자바 백엔드 개발에서 JPA는 객체와 데이터베이스 간의 매핑을 쉽게 해주는 강력한 도구입니다. 하지만, 단순한 CRUD를 넘어 복잡한 조회 쿼리를 작성하다 보면 JPA만으로는 부족한 순간들이 찾아옵니다. 이때 등장하는 것이 바로 JPQL, 그리고 QueryDSL입니다. 이번 글에서는 JPA → JPQL → QueryDSL로 이어지는 흐름 속에서 각각의 역할과 한계, 그리고 QueryDSL의 장점과 사용법까지 정리해 보겠습니다. 1. JPA란? JPA(Java Persistence API)는 자바 객체와 관계형 데이터베이스... Read More
-
Observer 패턴을 활용한 알림 시스템 리팩토링 경험기 TOP NEW
Observer 패턴을 활용한 알림 시스템 리팩토링 경험기 목차 서론: 기존 알림 시스템과 문제점 Observer 패턴이란? 기존 코드: 알림 시스템 구조 리팩토링 후 변화 결론: 리팩토링의 효과 서론: 기존 알림 시스템과 문제점 이번 글에서는 기존의 알림 시스템을 어떻게 Observer 패턴을 활용하여 리팩토링했는지 그 과정을 설명하려 합니다. 기존 시스템에서의 문제점을 해결하고, 유지보수성을 높이기 위한 리팩토링 경험을 다룹니다. 기존 시스템은 알림을 여러 방식(이메일, 실시간 알림 등)으로 처리하는 로직이 따로 구현되어 있었습니다. 이로 인해 중복 코드, 의존성 증가, 확장성... Read More
-
Spring Security로 구현한 JWT 기반 인증 시스템 TOP NEW
🔐 인증과 인가란? 인증(Authentication)은 사용자의 신원을 확인하는 절차입니다. 예를 들어, 사용자가 아이디와 비밀번호를 입력하여 본인이 누구인지 증명하는 과정입니다. 인가(Authorization)는 인증된 사용자가 어떤 리소스에 접근할 수 있는지를 확인하는 절차입니다. 예를 들어, 일반 사용자는 관리자 페이지에 접근할 수 없도록 제한하는 것이 인가입니다. 이 두 개념은 보안 시스템을 설계할 때 반드시 함께 고려되어야 하며, Spring Security는 이 인증과 인가를 체계적으로 처리할 수 있도록 도와주는 프레임워크입니다. 🧱 Spring Security란? Spring Securit... Read More
-
Mutex: 웹 개발에서의 동시성 제어 이해 및 활용 TOP NEW
Mutex: 웹 개발에서의 동시성 제어 이해 및 활용 이번 글에서는 웹 애플리케이션에서 자주 부딪히는 동시성 제어 문제를 해결하기 위해 사용하는 Mutex의 개념과 활용 방안을 살펴보려고 합니다. 먼저 학습 목표를 정리하고, 실제 사례를 통해 왜 동시성 제어가 필요한지 이해한 뒤, Java/Spring 환경 예제와 함께 다뤄보겠습니다. 1. 학습 목표 Mutex의 기본 개념 이해 웹 개발 환경에서 동시성 제어가 필요한 이유 파악 비관적 락과 낙관적 락의 이해 2. 동시성 제어가 필요한 이유 웹 애플리케이션은 다수의 사용자 요청을 동시에 처리합니다. 이 과정에서 race conditio... Read More
-
스프링 시큐리티 TOP NEW
주제: Spring Security - 인증 아키텍처 1. 시큐리티 전체 흐름도 Spring Security의 인증 과정에서 전체적인 흐름을 파악하는 것이 중요합니다. 2. 인증 절차 흐름 인증(Authentication)은 특정 자원에 접근하려는 사용자의 신원을 확인하는 과정입니다. Authentication 개념 사용자의 신원을 확인하는 방법. 일반적으로 사용자 이름과 비밀번호 입력을 통해 수행됨. 인증이 성공하면 권한을 부여할 수 있음. Authentication 객체는 사용자 인증 정보를 저장하는 토큰 개념의 객체이며, SecurityContext에 저장되어 전역적으로 참조 가능. ... Read More
-
데이터베이스 커넥션의 원리와 핵심 개념 TOP NEW
스프링 기반 애플리케이션에서의 데이터베이스 커넥션 흐름: 이론과 실무 데이터베이스(DB)와의 통신은 스프링 프레임워크 기반 애플리케이션에서 성능과 안정성을 결정하는 핵심 요소입니다. 본 글에서는 스프링이 DB와의 커넥션을 어떻게 설정하고 관리하는지, 그리고 최적화된 커넥션 풀링 기법과 트랜잭션 관리 전략을 심도 있게 분석하겠습니다. 1. 데이터베이스 커넥션의 원리와 핵심 개념 1.1 DataSource와 커넥션 풀의 중요성 DataSource: 데이터베이스 연결을 생성하고 관리하는 객체로, 스프링에서는 DataSource 인터페이스를 통해 커넥션을 관리합니다. JNDI 기반, HikariC... Read More
-
스케일 업 vs 스케일 아웃 TOP NEW
스케일 업 vs 스케일 아웃 스케일 업은 쉽게 말하면 기존의 서버를 보다 높은 사양으로 업그레이드하는 것을 말합니다. 하드웨어적인 예를 들면, 성능이나 용량 증강을 목적으로 하나의 서버에 디스크를 추가하거나 CPU나 메모리를 업그레이드시키는 것을 말합니다. AWS의 EC2 인스턴스 사양을 micro에서 small, small에서 medium등으로 높이는 것으로 생각하면 됩니다. 스케일 업은 스케일 아웃보다 관리 비용이나 운영이슈가 적고, 사양만 올리면 되는 것이기 때문에 비교적 쉽습니다. 하지만, 성능 향상에 한계가 있으며 성능 향상에 따른 비용부담이 크고 서버 한 대가 부담하는 양이 많아서 자연재해 등의... Read More
-
Next.js에서 useSuspenseQuery 사용 시 발생하는 SSR 이슈 상황 TOP NEW
Next.js에서 useSuspenseQuery 사용 시 발생하는 SSR 이슈 분석 문제 상황 Error: Switched to client rendering because the server rendering errored 데이터 페칭시 공통적으로 사용하는 axiosClient에서 throw 하고 있던 에러. 서버렌더링시 문제라는 메세지를 보고 서버사이드 페칭로직들을 하나씩 클라이언트로 전환하며 문제지점을 확인하려 했다. 전체 페칭로직을 클라이언트로 전환했지만 문제가 해결되지 않았다. 그러던 중 useSuspenseQuery 사용 시 문제가 발생하는 것을 확인했다. 대쉬보드에서의 프로젝트 목록, 어드민 기... Read More
-
STOMP(WebSocket)에서 내부 브로커와 외부 브로커의 차이 TOP NEW
웹 애플리케이션에서 STOMP(Simple Text Oriented Messaging Protocol) 를 이용해 웹소켓 통신을 구현할 때, 내부 브로커(in-memory broker)와 외부 브로커(external broker)를 선택할 수 있습니다. 이 두 가지 방식의 차이를 이해하면 애플리케이션의 성능과 확장성을 고려한 적절한 아키텍처를 설계할 수 있습니다. 1. 웹소켓과 STOMP란? 본론에 들어가기 앞서 웹소켓은 무엇이고, Stomp는 무엇인지 간단히 소개하겠습니다. 웹 소켓 웹소켓은 웹 애플리케이션에서 실시간, 양방향 통신을 가능하게 하는 프로토콜입니다. 단일 TCP 연결을 통해 전이중(ful... Read More
-
Spring Transaction TOP NEW
Spring Transaction @Transactional(propagation = Propagation.REQUIRES_NEW)를 써보며 이번에 Spring에서 제공하는 @Transactional로 트랜잭션을 선언하고, 분리도 해보았다. 의도대로 동작하지 않는 바람에 오히려 많은 것을 배울 수 있었다. 이 글은 아래와 같은 흐름으로 진행된다. 트랜잭션이란 @Transactional이란 @Transactional의 옵션 propagation이란 오잉 왜 DB가 비어있지? (적용과 문제 해결 과정) 번외: 다음부터는 비동기 처리 트랜잭션 트랜잭션은 ‘작업의 한 단위’라고 하는데, ... Read More
-
모듈과 모듈 시스템 알아보기 TOP NEW
모듈과 모듈 시스템 1. 모듈이란 무엇인가? 소프트웨어 공학에서 모듈이란 독립성(Independence)과 은닉성(Hiding)을 만족하며 연관된 코드들의 묶음입니다. 독립성: 모듈은 독립적이어야 합니다. 모듈을 사용하기 전에 필요한 의존성을 알 수 있어야 한다. 모듈의 의존성이 모두 준비된다면 모듈을 사용하는 데 아무런 문제가 없어야 한다. 은닉성: 모듈의 사용자는 모듈의 내부 구현을 몰라도 됩니다. 공개된 인터페이스를 이용해 모듈과 통신합니다. 2. 모듈 시스템이란? 모듈 시스템은 연관된 코드 묶음이 모듈성을 ... Read More
-
JWT 기반 인증: 액세스 토큰과 리프레시 토큰 TOP NEW
액세스 토큰과 리프레시 토큰 JWT 기반 인증 방식에서는 일반적으로 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token)을 함께 사용하여 보안성을 높입니다. 1. 액세스 토큰 (Access Token) 액세스 토큰은 사용자가 인증된 후 API 요청을 수행할 때 필요한 토큰으로, 보통 짧은 유효 기간을 가집니다. 사용 목적: 인증된 사용자임을 증명하고, 요청을 처리할 권한을 부여하기 위해 사용됩니다. 유효 기간: 보안성을 위해 짧게 설정 (예: 30분~1시간) 특징: 클라이언트는 요청마다 액세스 토큰을 Authorization 헤더에 포함하여 전송합니... Read More
-
HTTP/1.1 과 HTTP/2 TOP NEW
1️⃣ 개요 프로젝트에서 알림 기능을 구현하기 위해 Firebase Cloud Messaging(FCM) Firebase Admin Java SDK 9.4.3 버전을 사용하던 중, HTTP/2 관련 오류가 발생했다. org.apache.hc.core5.http.ProtocolException: Header ‘Host: fcm.googleapis.com’ is illegal for HTTP/2 messages 이 오류는 채팅 메시지에 알림을 보내는 로직을 추가하면서 발생하였다. 사용자가 채팅을 연속으로 보낼 때, 각 메시지마다 FCM을 통해 알림이 전송되도록 구현했는데, 단기간에 많은 알림 요청이 발생하면서 위 ... Read More
-
Closure Table을 활용한 계층형 데이터 관리 TOP NEW
주제를 선정하게 된 배경 이번 프로젝트에서 MySQL을 사용하는 환경에서 계층형 구조의 게시판을 구현하고자 했습니다. 일반적으로 관계형 데이터베이스는 계층적인 데이터 구조를 표현하는 데 적합하지 않다고 알려져 있습니다. 하지만 프로젝트 기획상 하나의 프로젝트에는 여러 개의 단계가 존재하며, 각 단계별로 독립적인 게시판이 필요했습니다. 현재는 단계와 게시판을 별도로 관리하고 있지만, 향후에는 단계 자체도 게시판과 동일한 계층 구조로 확장할 가능성이 있다고 판단하여, 보다 유연한 계층 구조를 관리할 수 있도록 클로저 테이블(Closure Table) 방식을 도입하게 되었습니다. 관계형 데이터베이스에서 계층 구조를 ... Read More
-
React Virtual DOM과 useState 타입 정의 TOP NEW
React Virtual DOM과 useState 타입 정의 Intro React는 가상의 DOM을 실제 DOM과 비교하여, DOM 조작을 최소화하고 애플리케이션의 성능을 최적화시킬 수 있다. 그러다 생긴 의구심은 비교하는 타이밍이다. 이에 대해서는 컴포넌트 생명주기에 대해 알 필요가 있지만, 이번 내용에서는 가상 DOM과 실제 DOM의 비교 타이밍 및 그 과정의 순서에 대해 기술해보려고 한다. 추가적으로 Virtual DOM과 관련이 큰 useState 훅에 대해서도 간단하게 알아보자. 비교 타이밍 가상 DOM의 비교는 리액트 컴포넌트의 상태 state나 속성 props이 변경될 때 발생한다. 이는 ... Read More
-
중복 여부 판단을 위한 Set 과 반복문의 성능 비교 TOP NEW
중복 여부 판단을 위한 Set 과 반복문의 성능 비교 리스트로 들어온 요소들의 중복여부를 판단하기 위한 방법을 생각했을 때, 바로 떠오르는 것은 set 이었다. 여기에서 궁금한 것은 중복을 판단하기 위한 다른 방법이 있는지와 각각의 방법의 성능을 알고 싶었다. 크게 3가지의 방법이 존재한다. List 를 Set 으로 변경하여 List 와 Set 의 길이를 비교하는 방법 반복문으로 순회하면서 Set 에 순회 요소를 추가하면서 추가가 되지 않는다면 리턴하는 방법 Stream API 를 통한 중복 제거 (distinct 사용) 이 3가지의 방법을 횟수 별로 비교하여 성능을 비교하고자 한다. ... Read More
-
Amazon S3 보안 향상시키기 TOP NEW
안녕하세요 커널 3기 박예슬입니다. 많은 동기들이 S3를 활용하는 것을 자주 보았는데요, 저 또한 S3를 사용해보며 이런저런 문제를 겪었습니다. Amazon S3(Amazon Simple Storage Service)는 데이터를 안전하게 저장하고, 인터넷을 통해 접근하는 데에 편리하고 유용한 서비스지만, 보안 위험 요소를 동반할 수 있기 때문에 주의가 필요합니다. 이번 프로젝트에서 고민하고 공부하고 적용했던 보안 방식들에 대해 간략하게 소개해보고자 합니다. Amazon S3 보안이 중요한 이유 만약 누구나 인터넷을 통해 S3 버킷에 접근할 수 있다면 다음과 같은 문제가 발생할 수도 있습니다. 1. 외부 ... Read More
-
문제를 추적하는 로그 기록의 기본 TOP NEW
문제를 추적하는 로그 기록의 기본 프로젝트를 진행하며 신입 개발자 입장에서 로그 코드를 작성하는 것이 번거롭다고 느껴지거나, 로그를 남겨야 하는 이유가 와닿지 않을 수 있다는 생각이 들어 ‘문제를 추적하는 로그 기록의 기본’이라는 주제로 블로그를 작성하게 되었습니다. 신입 개발자의 관점에서 이해하기 쉽도록 소프트웨어 개발 및 운영에 필요한 로그에 대해 기본적인 접근 방식을 먼저 살펴보려 합니다. </br></br> 1. 로그를 남겨야 하는 이유 로그는 시스템 운영과 문제 해결에 있어 매우 중요한 역할을 합니다. 사용자나 시스템에서 발생하는 모든 활동을 기록함으로써, 서비스 장애나 보안 이슈 ... Read More
-
List 중간 요소를 List 맨 뒤에 추가할 때 ArrayList 와 LinkedList 의 성능 비교 TOP NEW
List 중간 요소를 List 맨 뒤에 추가할 때 ArrayList 와 LinkedList 의 성능 비교 스프링 서버를 개발하는 중에 배열을 순회하면서 배열의 중간에 있는 요소 중에 조건에 따라서 그 요소를 맨 뒤로 보내야 하는 로직을 작성해야 할 필요가 있었다. 나는 이 구조를 개발하기 위해서 List 를 사용하기로 하였고 그 중에서 ArrayList 와 LinkedList 를 선택해야 하는 상황이었다. 이 선택에 대한 테스트가 필요하여 해당 테스트를 진행한다. 테스트는 총 2가지를 진행할 것이다. 요소를 순차적으로 뒤에 추가할 경우 배열의 특정 중간 요소를 삭제하는 경우 배열의 특정 중간 ... Read More
-
Zanzibar에 대한 탐구 TOP NEW
1. 내가 왜 Zanzibar를 찾게 되었는가? 우리 프로젝트는 현재 두 가지의 권한을 가지고 있다. 관리자와 일반 사용자인지를 구분하는 Admin 권한과 우리 서비스에서 관리하는 프로젝트 별로 권한을 관리하여 서비스를 이용할 수 있는지는 확인하는 프로젝트 접근 권한. 이렇게 두 가지가 존재한다. Admin인지를 확인하는 방법은 간단했다. 우리는 SpringSecurity를 통해서 RequestURI에 admin으로 시작한다면, JWT Filter에서 등록한 인증 객체가 Admin 권한을 가지고 있는지 확인하도록 만들었다. 하지만 프로젝트 별로 해당 행동을 할 수 있는지 없는지를 구분하기 위해서는 조금 더 고려해... Read More
-
SSE로 실시간 알람 구현하기 TOP NEW
SSE 적용기 도입 계기 현재 진행 중인 관제 플랫폼 서비스에서는 특정 차량의 총 주행거리가 5,000km 이상일 경우 차량 점검 대상임을 판단하고, 해당 차량의 점검 필요 알림을 사용자에게 전달하는 기능을 구현이 필요 했다. 이 알림 기능의 경우 서버에서 클라이언트로의 일방향 전송만 필요하기 때문에, 웹소켓(양방향 통신) 대신 SSE(Server-Sent Events)를 사용하는 방안으로 진행하기로 했다. SSE 장점과 단점 SSE의 장점 서버에서 클라이언트로의 단방향 스트리밍이므로 구현 및 유지보수가 비교적 간단하다. 웹소켓보다 오버헤드가 적어, 단순 알림 전송에 적합하다. 기본적으로 클라이언트... Read More
-
Route53-not-working 해결기 TOP NEW
[카프카1] [카프카2] [카프카3] [카프카3]에서 기존 토픽을 상세조회하려고 하는데 위와 같이 timeout이 떴다. 해결을 위해 시도한 방법 위 에러와 동일한 블로그를 찾았다. https://wildeveloperetrain.tistory.com/219 블로그를 통해 카프카의 server.properties 정보에서 listeners 정보를 업데이트 해주었다. → 그래도 안됨. 주키퍼가 내가 설정한 토픽을 잘 바라보고 있는지 의심이 들었다. https://developnote-blog.tistory.com/172 블로그대... Read More
-
멀티모듈 아키텍처의 종류와 적용 경험 TOP NEW
멀티모듈 아키텍처의 종류와 적용 경험 1. 멀티모듈 아키텍처란? 멀티모듈 아키텍처(Multi-Module Architecture)는 하나의 프로젝트를 여러 모듈로 나누어 관리하는 방식으로, 각 모듈이 독립적으로 개발 및 테스트될 수 있도록 설계합니다. 이는 코드의 응집도를 높이고, 유지보수성과 확장성을 극대화하는 데 큰 도움이 됩니다. 다양한 프로젝트 요구사항에 따라 멀티모듈 아키텍처의 종류는 여러 가지가 있으며, 각기 다른 장단점을 가집니다. 이 글에서는 멀티모듈 아키텍처의 주요 유형, 우리가 실제로 도입한 방식, 그리고 이를 통해 배운 점들을 공유합니다. 2. 멀티모듈 아키텍처의 종류 2.1 레이어... Read More
-
JPA의 트랜잭션 처리가 Transactional 없이도 이루어지는 이유.(feat. Proxy) TOP NEW
Spring Data JPA를 사용할 때, @Transactional을 직접 선언하지 않아도 트랜잭션이 자동으로 적용되는 것을 확인할 수 있다. 어떻게 자동으로 적용되는 것일까? 그리고 이 과정에서 프록시는 어떤 역할을 할까? 이번 글에서는 Spring Data JPA의 트랜잭션 관리 원리를 프록시(proxy)와 관계지어 알아보자. 1. JPA Respository에서 @Transactional 없이도 트랜잭션이 동작하는 이유 Spring Data JPA에서 JpaRepository를 상속받으면 기본적으로 제공되는 CRUD 메서드(save(), findById(), delete() 등등)는 트랜잭션이 자동으로... Read More
-
Spring filter와 interceptor의 작동 방식과 사용 목적 차이 TOP NEW
Spring filter와 interceptor의 작동 방식과 사용 목적 차이 1. 들어가며 Spring 기반의 웹 애플리케이션을 개발하다 보면 요청과 응답을 가로채 특정 로직을 수행해야 하는 경우가 많습니다. 이러한 역할을 수행하는 대표적인 기능이 Filter와 Interceptor입니다. 이번 프로젝트를 진행할 때, 로그인 인증 부분을 개발하면서 Filter를 사용하게 되었습니다. 하지만 공부하는 도중 Filter와 Interceptor의 차이가 무엇이며, 어떤 상황에서 사용해야 하는지 궁금하여 블로그를 작성하게 되었습니다. 이 글에서는 Filter와 Interceptor의 개념과 차이점을 정리하고, 각각... Read More
-
crontab으로 로그 저장하기 TOP NEW
시작 앱의 로그를 파일로 관리하라는 피드백을 받았습니다. 현재 애플리케이션을 도커에서 실행중이기 때문에 도커 외부에 저장해야합니다. 왜냐면 컨테이너의 데이터는 휘발성이니까요 앱 내부에서 파일로 저장하는게 더 좋은 방법인 것 같지만 이걸 할 당시에는 내부에서는 저장하지 않고 있었어요 서버에 들어가지 않고 로그를 확인할 수 있는 수단이 필요했기 때문에 일단 crontab과 shell 스크립트를 사용해서 로그를 저장하기로 했습니다. 구현 목표 1분마다 한 번씩 로그를 출력하고 저장 이전에 있는 로그와 중복되지 않도록 한다. 로그는 하루에 한번 ... Read More
-
Amazon ECS(Elastic Container Service)을 활용한 운영 환경 구성 TOP NEW
Amazon ECS를 활용한 무중단 배포 파이프라인 구축 저희는 운영 환경에 Amazon ECS(Amazon Elastic Container Service)를 도입하여 컨테이너 오케스트레이션을 활용하고 있습니다. 또한, GitHub와 Jenkins를 연동하여 CI/CD 파이프라인을 구축함으로써 효율적인 배포 환경을 구성했습니다. 이 글에서는 GitHub에서 메인 브랜치에 코드가 머지되었을 때 ECS가 최신 이미지를 자동으로 가져와 롤링 업데이트 방식으로 무중단 배포되는 과정과 문제 발생 시 롤백 전략을 설명합니다. 1. ECS 기반 CI/CD 파이프라인 개요 🔹 전체 배포 흐름 GitHub에서 코... Read More
-
JPA 엔티티 설계에서 기본 생성자가 필요한 이유 : Reflection API와 접근제어자의 역할 TOP NEW
Entity설계 시 멘토님으로부터 “현업에서는 Entity에Setter나 AllArgsConstructor를 사용하지 않고 기본생성자(NoArgsConstructor)만 작성 후 정적 팩토리 메서드를 사용해 Entity객체를 생성한다”라는 피드백을 받았습니다. 그래서 “팩토리 메서드 내에 기본 생성자를 사용하도록 구현할 테니 기본 생성자를 객체 외부에서 사용하지 못하도록 해야겠지?” 라는 생각으로(뇌를 비우고) accessLevel을 Private로 설정했는데 InstantiationException이 발생했습니다. Reflection API와 JPA의 Entity관리에 대한 이해 부족으로 생긴 문제였고 정확히... Read More
-
일급 컬랙션 TOP NEW
-
JWT 기반의 인증 방식 학습 TOP NEW
JWT란? JWT는 JSON 데이터를 Base64URL로 인코딩한 문자열 형태의 데이터를 이용해 사용자 인증 및 정보 교환을 안전하게 수행하는 토큰 기반 인증 방식입니다. JWT는 전자 서명을 포함하여 변조를 방지하며, 서버에서 세션을 유지하지 않고도 사용자 인증을 할 수 있도록 도와줍니다. JWT는 주로 아래와 같은 구조로 구성됩니다: 1. Header: 토큰 타입과 해싱 알고리즘을 정의합니다. 2. Payload: 사용자 정보와 토큰의 만료 시간 등의 클레임(Claim) 데이터를 포함합니다. 3. Signature: Header와 Payload를 비밀 키로 서명하여 변조를 방지합니다. JWT는 일반적... Read More
-
람다를 사용하는 이유 TOP NEW
-
스프링 부트에서 구현한 구글 OAuth2 + JWT 로그인 구현, 이대로 안전할까? TOP NEW
현재 프로젝트에서는 스프링 부트(3.3.5)에서 구글 OAuth2 + JWT(Access Token) 방식을 사용해 로그인 기능을 구현했습니다. JWT(Access Token)을 쿠키에 저장하여 인증을 처리하는 방식인데, 과연 이 방법이 충분히 안전할까요? Refresh Token 및 블랙리스트 추가 구현이 필요한 이유는 무엇일까요? 이번 글에서는 현재 로그인 구현 방식의 보안 이슈를 살펴보고, 이를 개선하기 위한 방향을 고민해보겠습니다. 현재 로그인 구현 방식 1️⃣ 로그인 흐름 1. 사용자가 구글 OAuth2로 로그인 2. 서버에서 JWT(Access Token) 발급 3. JWT를 쿠키에 저장하여 인증... Read More
-
로그인 폼 UX 향상을 위해 고민해보기 (react-hook-form, server action, loading ui) TOP NEW
구현하고자 하는 것 react-hook-form과 zod를 이용하여 로그인 폼 작성과 검증 서버액션으로 로그인 요청 로그인 버튼을 눌러 응답을 받기 전까지 로그인 폼 비활성화 폼 제출 중 제출 버튼에 스피너 ui를 보여주기 1. 로딩 상태 관리 1-1. useState const [isLoading, setIsLoading] = useState(false); async function handleLoginAction(formData: FormData) { setIsLoading(true); try { const res = await loginAction(formData); if (re... Read More
-
열거 타입을 사용해야 하는 이유 TOP NEW
상수를 정의할 때 열거 타입(enum)을 사용해야 하는 이유 개발할 때 특정한 값을 상수로 정의하는 경우가 많습니다. 과거에는 int 타입의 상수를 나열하는 방식(정수 열거 패턴)이 일반적이었지만, 오늘날에는 열거 타입(enum)이 더 많이 사용됩니다 그렇다면 단순히 “많은 개발자가 사용하기 때문”이 아니라, 왜 enum을 사용해야 하는지 정확히 이해하는 것이 중요합니다 본 글에서는 정수 열거 패턴의 단점과 enum이 제공하는 이점을 비교하며, 열거 타입을 사용하는 이유를 공유하고자 합니다 정수 열거 패턴의 문제점 열거 타입이 등장하기 전에는 정수(int) 상수를 한 묶음으로 선언해 사용했습니다. pu... Read More
-
Next.js에서 Result 패턴을 활용한 HTTP 요청 에러 핸들링 TOP NEW
서론 Typescript에서 런타임 에러를 잡기 위해서 try…catch를 사용할 수 있습니다. try 블록 내 코드에서 비동기 요청을 수행하고, 만약 그 안에서 예외가 발생한다면 catch 블록 내 코드를 실행하여 에러를 처리하는게 일반적입니다. 이번 프로젝트에서는 토스트 형식으로 사용자에게 에러가 발생했음을 알리고 있습니다. 클라이언트측 요청인 경우, API 클라이언트에서 공통적으로 catch 블록에서 발생한 에러에 대한 토스트 메세지 상태를 세팅해주고 있습니다. 하지만 Next.js server를 통해 요청을 보낼 경우는 해당 방식을 사용할 수 없었고, 요청을 호출한 RCC에서 다시 에러를 핸들링 해야 ... Read More
-
안티패턴 - 양방향 레이어드 아키텍처 TOP NEW
안티패턴 - 양방향 레이어드 아키텍처 개발에는 정답이 없지만 유지보수성과 확장성 측면에서 좋지 않은 것으로 알려진 ‘안티패턴’이 존재합니다. 이번 글에서는 그중에서도 ‘양방향 레이어드 아키텍처(Bidirectional Layered Architecture)’에 대해 살펴보겠습니다. 양방향 레이어드 아키텍처(Bidirectional Layered Architecture) ‘양방향 레이어드 아키텍처’ 안티패턴은 레이어드 아키텍처를 따르는 프로젝트에서 자주 발생하는 문제입니다. 이는 레이어드 아키텍처에서 정의된 레이어들 간의 의존 관계에서 양방향 의존이 발생하는 경우를 의미합니다. 이를 설명하기 위해 먼저 레이어드 ... Read More
-
Refresh Token을 Redis에 저장하는 이유 TOP NEW
Refresh Token을 Redis에 저장하는 이유 1. 들어가며 현대 웹 애플리케이션에서는 사용자 인증과 인가가 매우 중요합니다. 특히, 무상태(stateless) 방식의 인증 시스템이 선호됨에 따라 JWT(Json Web Token)가 널리 사용되고 있습니다. 그러나 JWT의 특성상 토큰이 만료되기 전까지는 강제로 무효화할 수 없다는 단점이 존재합니다. 이를 보완하기 위해 많은 시스템이 Refresh Token을 사용하여 사용자 세션을 효율적으로 관리하고 있습니다. 일반적으로 Refresh Token은 지속성이 보장되는 데이터 저장소, 즉 디스크 기반의 데이터베이스에 저장하는 방식이 흔히 사용됩니다. 하지... Read More
-
yarn berry pnp일 때 nextjs docker image 만들기 TOP NEW
docker image를 만드는 과정에서 겪은 트러블 슈팅 과정을 기록했습니다. nodejs self-hosting 방식으로 docker image 만들기 공식 문서를 참고한 방법이며 가장 간단한 방법입니다. { "scripts": { "dev": "next dev", "build": "next build", "start": "next start" } } 의존성을 설치하고 build를 한 뒤에 start를 하면 됩니다. 해당 방식을 적용한 docker file은 다음과 같습니다. # 가져올 이미지를 정의 FROM node:20.9.0-alpine # 작업 디렉토리 설정 WO... Read More
-
클라이언트 환경에서 파일을 문자열로 변환할 수 없는 이유 TOP NEW
오픈소스 프로젝트의 첫 배포가 이번 주에 완료되었습니다! 🎉 이 프로젝트는 shadcn/ui 라이브러리의 dialog 컴포넌트를 활용하여 개발자들이 자주 마주치는 다양한 dialog 상황에 대한 코드 스니펫을 모아둔 모음집입니다. 첫 배포를 위해 우리 팀이 구현한 기능은 크게 세 가지입니다. 사용자들이 실제 구현된 모습을 직접 볼 수 있는 dialog 미리보기 화면 구현 원하는 코드를 바로 프로젝트에 적용할 수 있는 코드 복사 기능 코드의 가독성을 높이기 위한 코드 에디터 스타일 구현 이 중에서 저는 두 번째와 세 번째 기능의 개발을 맡았습니다. 코드 ... Read More
-
Conditions Management TOP NEW
들어가는 말 개발을 하다 보면 우리는 수많은 상황을 마주합니다. 얕게는 유저가 로그인을 했는가 아닌가. api 호출에 대한 응답이 에러인가? 로딩중인가? 성공인가? 등등 다양한 상황에 따라 이후 로직이 달라집니다. 이런 경우에 저는 if문, 삼항 연산자, AND 연산자 등을 사용하였습니다. 그러나 로직이 쌓이고 경우가 곱의 경우의 수(n x m)로 늘어난다면 이는 매우 가독성 측면에서 아쉬운 코드가 될 것입니다. 해당 문제를 고민하고 나은 방법을 찾아보고자 합니다. 복잡한 분기문을 마주하는 상황 다양한 상황 따라서 보이는 것이 다른 경우가 많습니다. 이런 경우 개발을 하며 보통은 if문, 삼항 연산자, AND... Read More
-
커스텀 예외 처리 TOP NEW
📗 시작하며 이 글은 커스텀 예외 처리를 어떻게 할지 고민하며 점진적으로 개선해나가는 과정을 담고 있습니다. 처음 커스텀 예외 클래스를 작성하시는 분부터, 더 좋은 예외 처리를 위해 고민하고 계시는 분들 모두에게 도움이 되는 글을 작성하고자 했습니다! 🙋♂️커스텀 예외를 왜 만들어야 하나요? 로또 번호는 1~45 사이의 숫자입니다. validateLottoNumber() 메서드는 이를 확인하고 범위를 벗어난 숫자에 대해 IllegalArgumentException을 던집니다. public class LottoNumber implements Comparable<LottoNumber> { ... Read More
-
SSR과 Cookie TOP NEW
들어가며 여러분이 처음 사이트에 들어갔을 때 사진이 약 1초가 지난 후에야 깜박이는 것처럼 뒤늦게 보여진다면 어떤 느낌이 드시나요? 신경쓰지 않는 분들이 있을 수도 있지만 제 경우에는 답답하게 느껴집니다. 이런 현상이 발생하는 이유는 API호출이 완료된 이후에야 데이터 보여주는 데에서 발생하기 때문입니다. 사이트에 들어가자마자 데이터가 채워있도록 보이게 만들려면 미리 데이터를 불러와서 꽂아주는 방식으로 해결할 수 있습니다. 이번 프로젝트에서 사용하고 있는 TanStack Query라이브러리에서 데이터를 미리 가져와서 보여주는 방법은 initialData를 이용하는 방식과 prefetchQuery를 이용하는 방... Read More
-
Spring AOP TOP NEW
Spring AOP AOP란? 관점 지향 프로그래밍 횡단관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임 여기서 나오는 횡단 관심사란 무엇일까요? 여기서 부가기능을 횡단 관심사(Cross-Cutting Concerns)라고 합니다. 횡단 관심사란 여러 모듈에 걸쳐있는 공통의 기능을 의미합니다. 예를 들어 로깅, 트랜잭션 관리, 보안/인증 등이 횡단 관심사에 해당합니다. 하나의 클래스가 있고 해당 클래스를 추적하기 위해 로그를 찍을 때, 클래스의 변경이 일어나게 된다면 어떻게 될까요? 연관된 로그가 적다면 문제가 없지만 50개, 100개라면 여기저기 퍼져있는 로그를 찾... Read More
-
Index TOP NEW
Index란? 안녕하세요. Kernel 360 백엔드 2기 크루 송해덕입니다. DB를 사용할 때 "Index를 잘 활용해야한다.", "Index를 걸어라" 라는 이야기들을 듣지만 이 Index가 무엇이고 어떻게 동작하는지 명확하게 아시나요? 오늘은 Index란 무엇이며 Index를 어떻게 사용해야 하는지 알아보는 시간을 가지도록 하겠습니다. Index란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조를 말합니다. 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는 것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞에 ... Read More
-
WebSocket TOP NEW
WebSocket 프로젝트에서 채팅을 구현할 때 WebSocket을 사용했다. 물론 HTTP를 사용해서 채팅을 구현 할 수는 있는데 왜 WebSocket을 사용해야 했었고 실시간 통신에는 WebSocket이 더 효율적인 선택인지 설명할거다. 🔥 WebSocket: 기존의 단방향 HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜 특징 일반 Socket 통신과 달리 HTTP 80 Port를 사용해서 방화벽에 제약이 없다 접속까지는 HTTP 프로토콜을 이용하고, 그 이후에는 자체적인 WebSocket 프로토콜로 통신 HTTP 통신의 특징인 (연결... Read More
-
세션과 JWT TOP NEW
인증과 인가란? 세션과 JWT에 대해서 설명드리기 전에 인증과 인가에 대해서 말씀드리겠습니다. 인증이란 Authentication 으로 사용자 또는 장치의 신원을 확인하는 과정입니다. 예를 들어 어떤 서비스를 이용하기 전에 아이디와 패스워드를 입력해서 서비스가 사용자의 신원을 확인하는 과정을 인증이라고 합니다. 인가는 Authorization 으로 사용자가 어떤 리소스에 접근할 수 있는지 또는 어떤 동작을 수행할 수 있는지 검증을 하는 것을 의미합니다. 예를 들어 무신사에서 상품을 삭제하는 기능을 사용자가 사용할 수 있는지 권한을 확인하는 과정을 의미합니다. 저희가 서비스를 개발할 때 인증과 인가를 사용해서 현... Read More
-
크롤링 TOP NEW
크롤링이란? 웹 크롤링 (Web Crawling) 웹 사이트의 전체 구조를 탐색하고 링크를 따라가며 광범위한 데이터 수집 주로 검색 엔진의 인덱싱에 사용 ‘선탐색 후추출’ 방식 중복 제거 필수, 및 수집 웹페이지에 색인 부여 예: 온라인 서점 사이트의 모든 페이지를 순회하며 페이지의 모든 데이터 수집 웹 스크래핑 (Web Scraping) 특정 웹페이지에서 필요한 정보만을 선택적으로 추출 가격 비교, 감정 분석, 데이터 저널리즘 등 특정 목적을 위해 사용 ‘선결정 후추출’ 방식 CSV, JSON, XML 등의 구조화된 형식으로 데이터 변환 예: 온라인 서점 사이트의 ... Read More
-
동시성 문제를 겪으며 해결한 경험 TOP NEW
안녕하세요. kernel360 크루 양상원입니다. 파이널 프로젝트를 진행하면서 겪었던 동시성 문제에 대해 해결했던 경험에 대하여 이야기를 진행하고자 합니다. 동시성을 겪었던 상황 프론트에서 태그 이름을 한글로 입력하는 과정에서 0.03초 안에 생성 요청이 2번이 발생하였습니다. private void validateDuplicateTagName(Long userId, String name) { if (tagDataHandler.checkDuplicateTagName(userId, name)) { throw ApiTagException.TAG_ALREADY_EXIST(); } } 위... Read More
-
도커 컨테이너 TOP NEW
도커 컨테이너 안녕하세요. kernel360 크루 김민규입니다. 이번 글에선 도커 컨테이너에 대해 이야기해보겠습니다. 컨테이너 = 리눅스 프로세스 도커 컨테이너는 가상머신이 아니라 리눅스 프로세스입니다. 도커는 리눅스의 커널이 제공하는 기술을 활용합니다. “컨테이너는 리눅스 프로세스이며, 도커는 리눅스 커널이 제공하는 기능을 사용하는 API 데몬이다.” <Red Hat 컨퍼런스 발표 영상> 그래서 윈도우, 맥에서는 다음의 과정을 거쳐 도커가 실행됩니다. 윈도우나 맥OS의 하이퍼바이저 가상화 기술을 사용하여 윈도우/맥OS에서 리눅스 가상머신을 실행. 실행된 ... Read More
-
TypeScript로 안전하게 API 호출하기 TOP NEW
프로젝트에서 백엔드와의 통신을 위해 fetch API를 활용하여 코드를 구현했습니다. GET API 요청을 위한 코드는 아래 사진과 같이 작성했습니다. const response = await fetch(`${BASE_URL}/clubs/${clubId}/clubMembers`, { method: "GET", headers: { "Content-Type": "application/json" }, credentials: "include", }); if (!response.ok) { throw new Error("멤버 정보 조회에 실패했습니다."); } return response.json(); ... Read More
-
RDB에 순서가 있는 데이터를 저장하는 방법 TOP NEW
RDB에 순서가 있는 데이터를 저장하는 방법 TechPick 프로젝트를 진행하며 순서가 있는 데이터들을 RDB(MySQL)에 저장해야하는 상황을 자주 마주쳤습니다. 사용자가 등록한 태그의 순서를 저장 폴더안에 다른 폴더와 픽들의 순서를 각각 저장 픽에 속하는 태그들의 순서를 저장 RDB에 순서를 가지는 데이터들을 어떻게 저장할지 고민했던 방법을 소개하려고 합니다. 첫번째 시도 : Delete all & Insert all 가장 단순한 방법입니다. 테이블 안에서 각 아이템들이 순서를 가지게 저장하기때문에 별도의 순서 컬럼이 필요 없습니다. 하지만, 순서 변경이 발생했을때, 관련된 아이... Read More
-
로깅을 통해 서비스 관리하기 TOP NEW
들어가는 말 프로젝트를 진행하며 기능 개발에 많은 시간을 할애합니다. 그러나 만들고 나서가 끝일까요? 지속적인 유지 보수와 함께 안정적인 서비스 제공 및 신규 유저 유입, 유저 이탈을 막기 위해 사용성과 관련된 다양한 요소를 파악하고 더 나은 방향으로 나가야할 것입니다. 프로젝트를 진행하며, 단순한 개발에서 끝이 아닌 사용자의 사용성과 관련된 요소를 가설을 세우고 검증하는 과정에 대해서 이야기해 보고자 합니다. 로깅이란? 제품을 개발하며 사용자의 움직임 서비스 사용 흐름 등을 예상하고 가설을 세웁니다. 이런 가설은 기획 당시의 서비스 이용 대상, 핵심 기능, 타서비스와의 차별점 등 다양한 요소에 전반적으로... Read More
-
Optimistic update 적용하기 TOP NEW
문제상황, 버튼을 눌렀는데 바로 하이라이팅이 안 되는데? 저희 프로젝트에는 북마크를 추가하면 문장에 하이라이트 색깔이 입혀지는 기능이 있습니다. 그런데 아래 사진을 확인하면 알 수 있듯이, 형광펜 버튼을 누르자마자 하이라이팅이 생기지는 않습니다. </br> 형광펜을 설정하는 api가 성공 요청을 보내야만 하이라이팅이 칠해지는 과정을 가지고 있습니다. api응답이 중간에 실패할 수도 있으니 성공(success)이라는 응답을 받고나서야 하이라이팅이 적용되어야하는게 어떻게 보면 아주 당연한 작업이기도 하죠. 그러나 사용자에게 보여주는 화면에서 이렇게 응답이 올 때까지 기다리는 것은 많은 경우에... Read More
-
monorepo에서 vscode jest extension 환경 설정 TOP NEW
Jest란? Jest는 메타(구 페이스북)에서 개발한 자바스크립트 테스트 라이브러리입니다. 간편하게 테스트를 할 수 있어 자바스크립트 개발자들에게 많이 사용되고 있습니다. Jest vscode extension Jest는 cli를 이용해서 jest 실행 명령어를 통해 테스트를 실행할 수 있습니다. jest, jest <특정 파일>, jest --watch 등의 커맨드에 명령어를 입력해도 되지만, vscode에서는 더 간단하게 jest를 실행할 수 있는 extension이 존재합니다. jest extension은 jest 명령을 찾을 수 있으면 기본적으로 실행 시 watch mode에서 모든 ... Read More
-
AWS 프리티어 효율적으로 사용하기 TOP NEW
안녕하세요, Kernel360 크루 이강민 입니다. 오늘 포스팅에서는 AWS 프리티어를 효율적으로 사용하는 방법에 대해 이야기해보려고 합니다. 왜? 이번 내용을 준비한 이유는 개인적인 프로젝트나 실험적인 프로젝트를 진행 할 때 AWS 환경에서 최저의 비용으로 운용하여 장기간 서버를 유지하고자 할 필요성을 느꼈기 때문에 준비했습니다. 우리의 자원은 생각보다 넉넉하지 않죠 😰 비용을 절감하는 방법 사실 가장 확실한 방법은 홈서버를 운용하는 겁니다. 하지만 이 방법에는 여러 문제가 있습니다. 초기 구성하기가 어렵다. 사실 한번 세팅해본 분은 알지만 여간 까다로운게 아닙니다. 공유기 세팅부터 컴퓨터 운영... Read More
-
API Cancelled 문제 해결하기 TOP NEW
1. 이런 글을 쓰게 된 배경 최근 진행한 프로젝트에서 평소처럼 form에 데이터를 보내는 Button을 누르면 API호출이 이뤄지는 로직을 구현하고 있었습니다. 그런데 이번에는 API호출이 되지 않고, 콘솔창에 API Cancelled라는 메시지가 뜨는 것을 확인할 수 있었습니다. 이 글에서는 API cancelled 문제가 일어난 배경과 그 문제를 해결하는 과정을 설명하려 합니다. 2. 구체적인 상황 및 코드 // 앞 부분 생략... const handleNicknameChange = () => { updateUserInfo({ nickname }); //tanstack query funct... Read More
-
OpenAPI TypeScript로 API 타입 관리 자동화하기 TOP NEW
API 통신을 사용하는 애플리케이션에서 수행되어야 하는 작업 중 하나는 프론트엔드와 백엔드가 어떻게 데이터를 주고 받을지 협의하는 것입니다. 이를 위해 문서화 작업을 수행하는데, 그 방법 중 하나가 Swagger를 사용하여 OpenAPI 사양을 작성하는 것입니다. 백엔드 개발자가 Swagger로 문서화 작업을 진행하면, 프론트엔드 개발자는 이 문서를 참고하여 주고받아야 할 데이터의 구조를 파악할 수 있습니다. 특히 TypeScript를 사용하는 프론트엔드 개발자의 경우, 이 문서를 바탕으로 데이터에 대한 정확한 타입을 지정할 수 있어 더욱 유용합니다. 이렇게 Swagger를 통해 프론트엔드와 백엔드 간의 데이... Read More
-
Floating UI 소개 TOP NEW
Floating Element란? Floating Element는 화면의 기본적인 문서 흐름에서 벗어나서, 다른 콘텐츠 위에 배치되는 UI 요소들을 말합니다. 보통 사용자가 특정 상호작용을 할 때 동적으로 나타나며, 화면의 특정 부분에 위치해 있거나, 특정 기준 (마우스 위치, 텍스트 필드 등)에 따라 위치가 조정됩니다. 여기서 말하는 floating element의 예시는 다음과 같습니다. Tooltip: 마우스를 특정 요소에 올렸을 때 나타나는 간단한 설명 텍스트. Popover: 사용자가 클릭했을 때 더 복잡한 정보를 표시하는 작은 팝업. Select Menu: 사용자가 선택할 수 있는 옵션... Read More
-
Feature-Sliced Design (FSD) 소개 TOP NEW
들어가며 대규모 프론트엔드 애플리케이션을 개발하면서 가장 큰 도전 과제 중 하나는 확장성과 유지보수성입니다. 프로젝트가 커질수록 구조가 복잡해지고, 기능 추가나 변경이 기존 코드에 의도치 않은 영향을 미칠 가능성이 커집니다. 이런 상황에서 Feature-Sliced Design(FSD) 은 유용한 아키텍처 패턴으로, 각 기능을 독립적이고 재사용 가능하게 모듈화하여 관리할 수 있도록 도와줍니다. 이번 글에서는 FSD의 기본 개념을 소개하고, 도입을 고민하는 분들을 위해 그 장점과 도입 시 유의해야 할 점들에 대해 알아보겠습니다. 왜 Feature-Sliced Design인가? 기존의 프론트엔드 구조는 주... Read More
-
웹 접근성을 알아보자 TOP NEW
들어가는 말 자기소개를 하는 멘트에 저는 “UX측면에 신경을 많이 쓴다.”라고 이야기 합니다. 그런데 어느 날, 답변에 대한 후속 질문으로 “디자이너가 동일한 디자인 파일을 넘겨주었을 때, 개발자는 어떻게 하면 스스로의 역량을 가장 잘 나타낼 수 있을까요?”라는 질문을 받았습니다. 그에 대한 답을 고민하던 중 웹 접근성에 대해 알게되었습니다. 웹 접근성이란 무엇인지 어떤 이점이 있는지 이야기해보려 합니다. 웹 접근성을 영어로 표현하면 “Web Accessibility”라고 하고, 이를 짧게 줄여서 a11y라고 표현하기도 합니다 개발자가 고려할 수 있는 UX 성능 최적화 이... Read More
-
Yarn Berry로 전환해야 하는 이유 TOP NEW
들어가며 소프트웨어 개발 환경에서, 패키지 관리 시스템은 개발자의 생산성과 코드 품질, 협업 효율성에 직결되는 중요한 요소입니다. 과거에는 npm과 Yarn Classic이 각자의 장단점을 가진 채 대표적인 패키지 매니저로 사용되었습니다. 특히 Yarn Classic은 npm보다 더 빠르고 일관된 설치 환경을 제공하여 많은 개발자들에게 사랑받았습니다. 그러나 대규모 프로젝트가 늘어나면서 Yarn Classic과 npm 모두 의존성 관리, 설치 속도, 확장성 측면에서 한계를 보이기 시작했습니다. 이러한 문제를 해결하기 위해 Yarn Berry가 탄생했습니다. Yarn Berry는 Yarn Classic의 다음... Read More
-
Headless Component TOP NEW
Headless Component React 개발을 시작할 때부터 유지보수의 중요성에 대해 계속 들어왔습니다. 특히 코드를 컴포넌트로 분리하여 재사용성을 높이는 것이 중요하다고 강조되었습니다. 이를 염두에 두고 자주 사용되는 요소들을 독립적인 컴포넌트로 나누며 프로젝트를 진행했습니다. 하지만 사용자의 요구사항은 계속 변했고, 같은 핵심 기능에 다른 외형이나 추가 기능이 필요한 경우가 많아졌습니다. 결과적으로 컴포넌트가 점점 커져 코드 가독성이 떨어지고 재사용성도 낮아지는 딜레마에 빠졌습니다. 이런 고민을 해결할 방법을 찾던 중에 Headless Component라는 개념을 알게 되었습니다. 이는 UI와 로직... Read More
-
ES Modules과 CommonJS TOP NEW
Module은 무엇인가요? 모듈은 코드의 집합입니다. 코드의 대부분은 변수를 변경하는 것이므로 이러한 변수를 어떻게 구성하느냐에 따라 코드 유지 관리에 큰 영향을 미칩니다. 모듈을 사용함으로써 각각 격리된 환경을 제공하고(충돌 방지), 재사용성과 유지 보수성을 높입니다. JS에는 대표적으로 ES Modules, CommonJS 모듈 시스템이 있습니다. CommonJS 란? CommonJS 모듈은 Node.js용 JavaScript 코드를 패키징하는 방식입니다. 모듈은 require와 module.exports를 사용하여 정의됩니다. ES Modules 이란? ECMAScript modules은 재사용을... Read More
-
렌더링 최적화 자체 제공 시스템, React Virtual DOM TOP NEW
0. 들어가며 - React와 렌더링 최적화 프론트엔드 개발을 하면서 최적화, 그 중에서도 렌더링 최적화는 빠질 수 없는 부분이죠. 우리는 개발을 하면서 개발자도구의 lighthouse, profiler 등을 이용해서 렌더링 변경사항을 확인하고 useMemo, useCallback 최적화에 용이한 리액트 훅을 신경써서 사용한다든가, api 응답을 caching하는 tanstack query를 이용한다든가, 하는 여러가지 방법을 이용해서 리액트 최적화를 실현하 기 위해 노력합니다. 이렇게 개발자가 직접 프로그래밍을 하면서 렌더링 최적화를 신경써야 하는 부분이 대다수이지만 리액트가 내부적으로 렌더링 최적화를 고려하여... Read More
-
RSC를 알아보자! TOP NEW
들어가는 말 Next 13 업데이트에 app directory가 되면서, app directory 내부 모든 컴포넌트는 기본적으로 서버 컴포넌트로 동작이 됩니다. 그러나 이를 클라이언트 컴포넌트로 설정하고자 한다면 파일 최상단에 use client를 선언하면 됩니다. 그런데 어떤 상황에 서버, 클라이언트 컴포넌트를 쓰면 좋을까요? 두 컴포넌트의 목적과 차이점 등을 살펴보고자 합니다. RSC가 뭐지요? RSC는 React Sever Component의 약자로 말 그래도 서버 컴포넌트입니다. 이는 서버에서 실행되는 컴포넌트 로 이해할 수 있습니다. 그러나 서버에서 어떻게 컴포넌가 렌더링되고 ... Read More
-
싱글톤 패턴 TOP NEW
싱글톤 패턴이란 싱글톤 패턴은 특정 클래스의 인스턴스를 1개만 생성되는 것을 보장하는 디자인 패턴입니다. 즉, 생성자를 통해서 여러 번 호출이 되더라도 인스턴스를 새로 생성하지 않고 최초 호출 시에 만들어두었던 인스턴스를 재활용하는 패턴입니다. 싱글톤 패턴을 사용하면 메모리 사용을 최적화하고, 객체 생성 비용을 절감할 수 있습니다. @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); MemberService memberSe... Read More
-
reflection TOP NEW
JAVA의 Reflection을 알아보기 전 용어를 정리하겠습니다. 바인딩( Binding ) 컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것. 정적 바인딩( static binding ) 컴파일 시점에 값과 타입이 정해지는 것 동적 바인딩 ( dynamic binding ) 런타임 시점에 값과 타입이 정해지는 것 컴파일 ( Comfile ) 소스 코드를 다른 프로그램이나 기게( H/W )가 처리하기 용이한 형태로 변환하는 과정 이 과정중에 오류가 발생한다면 ‘ 컴파일 에러 ‘ 런타임( Runtime ) 컴퓨터 프로그... Read More
-
VO를 사용해야 하는 이유와 세 가지 특징 TOP NEW
안녕하세요, 저는 Kernel 360 백엔드 2기 크루 박소은이라고 합니다 ! 제가 오늘 이야기할 주제는 VO입니다. VO는 Value Object의 약자로, 값 객체입니다. 말 그대로 값 그 자체를 표현하는 객체입니다. VO = Value Object (값 객체) = 값 그 자체를 표현하는 객체 🖼️ 실생활 속 VO의 예시 실생활에서 값 그 자체를 표현하는 객체에는 어떤 것이 있을까요? 돈은 VO와 유사한 객체라고 볼 수 있습니다. 아래에 오만원권 세 장이 있습니다. 지폐에는 고유번호가 적혀 있습니다. 고유번호가 다르다고 해서 사람들이 다른 오만원이라고 생각할까요? 고유 번호가... Read More
-
좋은 객체지향 설계의 5원칙 TOP NEW
안녕하세요. kernel360 크루 양상원입니다. 객체지향 설계를 위해 필요한 원칙들에 대해 이야기하려고 합니다. SOLID이 필요한 이유 Java를 공부하면서 객체지향 특징과 원칙에 대해 한 번쯤 들어보셨을 것이라 생각합니다. 오늘은 좋은 객체지향 설계를 하기 위해 꼭 필요한 원칙인 SOLID에 대해서 이야기 해보도록 해보겠습니다. 클린 코드로 유명한 Robert C Martin이 2000년 논문 “디자인 원칙과 디자인 패턴”에서 개념을 소개하였습니다. 이후 Michael Feathers가 SOLID라는 약어를 사용하며 더욱 발전하게 되었습니다. 이 다섯 가지 원칙 덕분에 객체지향 프로그래밍의 세계에 ... Read More
-
브라우저 보안 정책과 CORS TOP NEW
브라우저 보안 정책 안녕하세요! 커널360 백엔드 2기 김민규 크루입니다. 이번 시간에는 브라우저 보안 정책에 대해 이야기해보겠습니다. 브라우저 보안 정책은 언제 처음 도입 되었을까요? 이는 1995년 Netscape 2.02. 버전에서 등장한 보안 정책, Same Origin Policy 에서 부터 시작됩니다. ◼️ Same Origin Policy 넷스케이프 네비게이터 출처 : https://en.wikipedia.org/wiki/Netscape_Navigator_2 1995년, 넷프케이프 네비게이터 브라우저에 새로운 스크립트 언어가 추가되었습니다. 동적으로 브라우저의 DOM에 접근하고, 내용... Read More
-
해시 알고리즘 쉽게 배우기 TOP NEW
해시 알고리즘 쉽게 배우기 🔥 해시 알고리즘을 사용한 해시 테이블 예 데이터를 빠르게 저장하고 검색하기 위한 알고리즘 ‘키(key)’를 사용하여 ‘데이터 값(value)’을 조회하는 방법. ‘키-값’을 ‘해시 테이블’이라는 데이터 구조에 저장하여 키에 매핑되는 인덱스 값으로 빠르게 찾는다 장점 - 해시 알고리즘을 사용하면 데이터를 찾는 검색 성능이 평균 O(1)로 좋아진다 - 충돌이 없다면!!! 키에 대한 데이터 있는지 확인 쉬움 단점 - 저장공간이 좀 더 필요 - 여러 키에 해당하는 주소가 동일한 경우 충돌을 해결하기 위한 다른 자료구조 필요 - 데이터 충돌하면 연결된 리스트들까지 모두 검색 → O(... Read More
-
NoSQL TOP NEW
NoSQL이란? 1. 비관계형 데이터 모델 유연한 스키마 : RDBMS 처럼 정해진 스키마를 바탕으로 데이터를 입출력 할 때 형태가 정해지지 않는다. 다양한 데이터 모델 : JSON, XML 등의 데이터 형식으로 저장할 수 있다. 2. 확장성 수평 확장 : 샤딩을 통한 분산 저장을 하는 NoSQL 특성 상 성능 확장을 위해 단순히 서버 컴퓨터의 수를 늘리는 방식이 가능하다. 샤딩 : 데이터를 조각내 분산 저장하는 데이터 처리 기법 3. 고가용성 및 장애 복구 자동 복제 : 데이터 복제 및 분산 저장을 통해 높은 가용성과 장애 복... Read More
-
인터페이스를 활용하여 조건분기 개선하기 TOP NEW
안녕하세요, Kernel360 크루 이강민 입니다. 오늘 포스팅에서는 인터페이스를 활용하여 조건분기를 개선하는 방법에 대해 이야기해보려고 합니다. 조건분기 조건분기는 아마도 우리가 코드를 작성하면서 가장 마주치는 친구들이죠. 가장 많이 사용하면서 가장 많이 실수하는 부분이기도 합니다. 너무 쉽지만 정말 잘 사용하고 있다라고 확신 할 수 있나요? 자주하는 실수 if문의 무한 중첩 가령 우리는 여러 요구사항을 맞이 할 때 복잡한 분기를 맞이하고는 합니다. 이러한 요구사항을 가장 쉽게 풀어 갈 수 있는 방법이 조건 분기인데요. 아마도 개발을 처음 시작하는 사람들은 아래와 같이 코드를 작성해본 경험이 있을 겁니다. ... Read More
-
Optional<T> TOP NEW
Optional란? 안녕하세요. Kernel 360 백엔드 2기 크루 송해덕입니다. 우리가 Spring JPA를 사용할 때 findByID를 하게 되면 반환값으로 항상 Optinal을 Return하게 됩니다. 그런데, 이런 Optional을 여러분은 올바르게 사용하고 계신가요? 오늘은 우리가 자주 사용하지만 올바르게 사용하지는 못하는 Optional<T>에 대해 알아보겠습니다. 어떤 기능을 알아보기 위해 가장 좋은 방법은 Documentation을 찾아보는 것입니다. Optional은 JDK 8에서 람다식, Stream과 함께 등장하였습니다. Oracle에서 제공하는 JDK DOCS를 보면 Op... Read More
-
정적 팩토리 메서드 패턴 TOP NEW
Static Factory Method Pattern 정적 팩토리 메서드 패턴이란? 지금까지 객체를 인스턴스화 할 때 직접적으로 생성자를 호출하고 생성했는데, 이와는 반대로 객체 생성 역할을 하는 메서드를 통해 간접적으로 객체 생성을 유도하는 것이 정적 팩토리 메서드 패턴이다. 조슈아 블로크의 이펙티브 자바에서 소개하는 아이템 중에서 첫 번째로 조언하는 것이 ‘생성자 대신 정적 팩토리 메서드를 고려하라’ 인데, 왜 이렇게 한단계 더 거쳐서 정적 팩토리 메서드를 통해 객체를 생성하라는 것인가에 대해 그 장점과 단점을 알아보자. 정적 팩토리 메서드의 장점 1. 생성 목적에 따라 네이밍이 가능하다 정적 팩토리 ... Read More
-
ArrayList vs LinkedList TOP NEW
배열(Array) 동일한 타입의 데이터를 연속적인 메모리 공간에 저장하는 자료구조 선언할 때 크기를 지정해야 하며, 한번 정해진 크기를 변경할 수 없다. 인덱스를 이용해 상수시간(O(1))에 배열의 임의의 원소에 접근할 수 있다. 타입[ ] 배열이름 = new 타입[ ] 형태로 선언한다. int[] arr = new int[5]; 리스트(List) 데이터를 순서대로 저장하는 자료 구조 선언 이후에도 크기를 동적으로 변경 가능 구현체로 ArrayList, LinkedList 등이 있다. List<Integer> list = new ArrayList<>();... Read More
-
Cache&Redis - 스프링부트 적용까지 TOP NEW
안녕하세요, 커널360 백엔드 2기 크루 김민주입니다. 🎀 오늘 제가 여러분과 함께 나누고자 하는 주제는 최근 E2E 프로젝트에서 많이 언급된 Cache와 Redis에 대한 것입니다. 특히, 스프링부트에 어떻게 적용할 수 있는지까지도 자세히 설명드릴 예정이에요. Cache의 개념과 필요성 여러분, 거대한 도서관을 한번 상상해보세요. 이 도서관에는 수십만 권의 책이 보관되어 있는데, 이 중에는 수백 년 된 고서부터 최신 신간까지 다양하게 포함되어 있습니다. 그런데 이렇게 많은 책들은 도대체 어떻게 보관되고 있을까요? 대부분의 사람들은 “그냥 책꽂이에 꽂혀 있겠지”라고 생각할 수 있지만, 사실 이 도서관은 굉장히 정... Read More
-
JavaScript 모듈 번들러의 이해 TOP NEW
부트업 과정 전까지 Webpack은 제게 그저 ‘CRA로 생성되는 무언가’로만 인식되고 있었습니다. 하지만 부트업 중 Webpack이 modern JavaScript 앱을 위한 정적 모듈 번들러라는 것을 알게 되었습니다. modern JavaScript 앱을 위한 정적 모듈 번들러 이 설명을 구성하는 용어들을 글에서 하나씩 살펴보고 이해하고자 합니다. Modern JavaScript JavaScript는 1995년 처음 등장한 이후 웹 개발의 핵심 도구로 자리 잡았습니다. 초기 JavaScript는 주로 간단한 스크립팅에 사용되었지만, 웹 애플리케이션의 복잡성이 증가하면서 언어 자체도 발전할 필요가 있었... Read More
-
Suspense를 사용하여 Data Fetching 처리하기 TOP NEW
Suspense를 사용하여 Data Fetching 처리하기 이번 글에서는 Suspense를 활용해 data fetching을 처리해보겠습니다. 각각 useEffect를 사용한 방식과, Suspense를 활용한 방식의 컴포넌트를 구현하고 성능을 비교해보겠습니다. 구현할 컴포넌트의 조건은 아래와 같습니다. CatProfile, CatInfo 모두 로딩중일 때는 CatProfile이 로딩중임을 표시하기. CatProfile 컴포넌트가 로딩 중일 때는 CatProfile이 로딩중임을 표시하기. CatInfo가 로딩 중에는 CatInfo가 로딩 중임을 표시하기. 조건에 따라 구현된 화면은 아래와 같... Read More
-
CI/CD의 개념과 필요성 TOP NEW
1. 이런 글을 쓰게 된 배경 최근 진행한 헤커톤에서 팀원 교체를 경험하게 되었습니다. 서로 다른 코드 스타일로 인해 전체 소스코드가 개발이 진행되며 조금씩 어지러워진다는 느낌이 들기도 하였습니다. 이는 프로젝트의 규모가 커지며 더 심각하게 느껴질 수 있는 부분일 것입니다. 따라서 저는 위와같은 어려움을 겪으며 CI(지속적 통합)와 CD(지속적 배포)의 필요성을 느끼게 되었습니다. 팀원이 변경될 때마다 발생하는 문제를 최소화하고, 코드 품질을 유지하며, 개발 속도를 높일 수 있는 방법을 찾기 위해 CI/CD와 관련하여 글을 작성하게 되었습니다. 이 글에서는 CI/CD가 왜 중요한지, 어떻게 구현할 수 있는지... Read More
-
함수 컴포넌트에서의 Redux 성능 최적화 TOP NEW
들어가며 Redux는 리액트 애플리케이션의 강력한 상태 관리 방법을 제공하지만, 잘못 사용하면 성능 이슈가 발생할 수 있습니다. 이번 글에서는 Redux를 사용할 때 적용할 수 있는 성능 최적화 기법에 대해 알아보겠습니다. Redux와 함수 컴포넌트에서 발생하는 성능 이슈 다음과 같이 크게 2가지 문제를 생각해 볼 수 있습니다. 불필요한 리렌더링 : Redux 상태가 변경될 때마다, 연결된 컴포넌트들은 리렌더링됩니다. 하지만 모든 상태 변경이 해당 컴포넌트와 관련된 것은 아닐 수 있습니다. 이로 인해 불필요한 리렌더링이 발생하여 성능 저하를 일으킬 수 있습니다. 비효율적인 상태 선택과 계산 : ... Read More
-
Cautions when making API calls TOP NEW
안녕하세요, Kernel360 FE 1기 크루 양하연 입니다. 오늘 포스팅에서는 외부 API호출하실 때에 주의하실 점에 대해서 제가 이번에 참여한 프로젝트를 예시로 들어 설명드리려고 합니다. 개발자로서 일상적인 작업 중, 예상치 못한 오류에 직면하는 순간들이 종종 있습니다. 최근 저는 고유한 ID에 대해 요청하는 사람별로 다른 Enctpyed Value가 반환되는 상황을 마주했습니다. 암호화 관련 개념을 안다면 이 상황은 전혀 문제가 될 것 없는 아주 당연한 상황이라고 볼 수 있겠지만, 암호화에 대한 지식이 없는 저로서는 상당한 혼란을 겪었습니다. 오늘은 과연 이 상황이 무엇인지에 대한 관련 개념 소개과 더불어,... Read More
-
스프링 배치 튜토리얼 TOP NEW
안녕하세요, Kernel360 크루 김찬규 입니다. 오늘 포스팅에서는 WashFit 프로젝트에 배치성 작업을 추가하며 알게된 내용을 바탕으로 스프링 배치에 쉽게 입문 하실 수 있도록 도와드리려고 합니다. 배치 배치 처리는 컴퓨터에서 사람과 상호 작용 없이 이어지는 프로그램(작업) 들의 실행입니다. 당연히 스프링 배치를 사용하지 않더라도 배치성 작업을 처리할 수 있겠죠. 그렇다면 언제 스프링 배치를 사용해야 할까요? 왜 스프링 배치를 사용해야 하나요? 스프링 배치 Spring Batch 는 기본 일괄 처리 작업을 자동화하며, 일반적으로 오프라인 환경에서 사용자 상호작용 없이 유사한 트랙잭션을 세트로 묶어 처... Read More
-
Asynch in Java TOP NEW
안녕하세요. Kernel360 1기 신종민입니다. 오늘 제가 준비한 내용은 자바에서의 비동기 프로그래밍에 대한 것입니다. 동기와 비동기 개념 우선 동기와 비동기의 기념에 대해서 설명드리겠습니다. 동기 프로그래밍은 작업이 순차적으로 진행하도록 하는 것입니다. 만약 이전의 작업이 완료되지 않으면 다음 라인은 실행이 되지 않습니다. 반면에 비동기 프로그래밍은 작업이 완료될 때까지 기다리지 않고 잠재적으로 오래 실행되는 작업을 시작하여 해당 작업이 실행되는 동안에도 다른 이벤트에 응답할 수 있게 하는 기술입니다. 작업이 완료되면 프로그램이 결과를 제공합니다. 프로그래밍이 다소 복잡하지만 자원을 효율적으로 사용할 수 있... Read More
-
가성비 있는 단위테스트 TOP NEW
안녕하세요, 김현지입니다. 이번 주제는 가성비 있는 단위 테스트입니다. 제가 이 주제를 선택한 이유는 컨트롤러 단위 테스트를 작성하면서 비용 대비 얻는 효과가 적은데?라는 고민으로부터 시작했습니다. 단위테스트 단위 테스트를 왜 작성하는걸까요? 제가 가장 좋아하는 열역학 제2법칙 엔트로피 증가의 법칙 때문입니다. 엔트로피 증가의 법칙은 모든 물질과 에너지는 무질서를 향해 간다는 법칙인데요, 소프트웨어 역시 이 법칙에서 크게 벗어나지 않습니다. 따라서, 무질서를 늦추기 위한 수단이 소프트웨어에서는 단위 테스트입니다. 우선, 단위 테스트의 목표가 무엇일까요? 단위 테스트의 목표는 소프트웨어 프로젝트의 지속 가능한 성... Read More
-
테스트코드에서의 유연한 Fixture 생성 (ObjectMother패턴 적용기) TOP NEW
개요 현재 진행중인 프로젝트(클라이밍 커뮤니티 Orury)의 테스트코드를 작성하며, 테스트코드에서의 Fixture(테스트용 객체) 생성 중복에 대한 고민과 그 해결책들에 대해 생각해봤습니다. 우선, 아래와 같은 배경(팀적 컨벤션) 하에 이뤄진 과정임을 말씀드립니다. Entity 코드에서는 @Setter의 사용을 금지함. Dto는 record로 구현함. 팩토리 패턴을 적용하여, Entity와 Dto에서 of() 메서드를 생성자로 활용함. (@Builder 활용X) 기존 코드 위와 같은 배경에서, 기존의 테스트코드에서 Fixture 생성메서드는 다음과 같이 구현돼있습니다. private... Read More
-
다이나믹 프로그래밍 TOP NEW
안녕하세요. 이번에 다이나믹 프로그래밍에 관하여 기술세미나를 드릴 김원상입니다. 다이나믹 프로그래밍은 코딩테스트를 처음 접하시는 분들에게는 진입장벽, 조금 익숙하신 분들에게는 알다가도 모를것 같은 알고리즙인데요. 제 나름대로 다이나믹 프로그래밍 문제를 접근하는 방법과 어떤 식으로 공부하면 좋을지에 대한 생각을 나눌 수 있을 것 같아 선택한 주제입니다. 커널360 코딩테스트에도 나왔고, 다른 기업 코딩테스트 후기를 봐도 조금씩 나오기 때문에 연습을 많이 해두시면 분명 원하는 회사를 가시는데 도움이 될 거라 생각합니다. 1. 리처드 E. 벨만 다이나믹 프로그래밍은 리처드 E. 벨만이라는 수학자가 처음 고안한 알고... Read More
-
APM(feat.Pinpoint) TOP NEW
안녕하세요. APM 그리고 핀포인트에 대해 발표하게 된 홍주광입니다. LGTM 여러분 LGTM 이라는 말을 들어보셨나요? 코드리뷰 때 들어보셨을 것 같은데요. 제가 소개드릴 LGTM 은 코드리뷰 때가 아닌 그라파나에서 밀고 있는 기술스택을 의미합니다! L : Limit(로그 수집 저장소) G : Grafana(시각화) T : Tempo(분산 추적 저장소, APM) M : Mimir(시계열 메트릭 저장소) LGTM을 미는 이유 그렇다면 그라파나에서는 왜 LGTM 을 밀고 있을까요? 보통 시스템 모니터링, 로깅, 애플리케이션 성능 모니터링을 구성하기 위해 대부분의 회사에서는 여... Read More
-
DNS 흐름 파악하기 TOP NEW
목차 도메인과 호스트네임 DNS란 DNS 동작 과정 DNS 레코드 타입 최종 정리 1. 도메인과 호스트네임 www.naver.com 이라는 URL이 있을 때 도메인은 어느부분을 말하는 것일까요? www를 제외한 naver.com이 실제 도메인입니다. 그럼 우리가 사용했었던 www는 무엇일까요? www는 호스트네임 입니다. www 말고도 여러가지가 도메인 앞에 .과 함께 붙게되는데 예를들자면 map.naver.com news.naver.com 이라면 news, map은 호스트 네임 입니다. 이제 실제로 DNS가 무엇이고 어떻게 동작하는지에 대해 네이버 웹사이트에 접속하... Read More
-
JVM TOP NEW
JVM 반갑습니다. 지난시간 RDBMS에 이어 이번에는 JVM을 주제로 기술세미나 발표를 한 정지용 입니다. [1. 개요] 우리가 자바를 공부하고, 스프링을 쓰고 있지만 기업의 니즈 때문에 라는 이유를 빼고, 왜 자바를 쓰는지 생각해보신적 있으신가요? 제가 생각하는 자바를 쓰는 이유는 객체지향이라는 개념적인 부분도 있겠지만 우리가 도커를 사용하듯 OS에 종속이 최소인 기술적 장점도 있기 때문이라 생각합니다. 이번 시간에는 JVM이란 무엇인지 일부 알아보는 시간을 가져보고자 합니다. [2. JVM란?] JVM은 이름 그대로 자바를 가상의 환경에서 작동시켜주는 소프트웨어입니다. WORA 원칙을... Read More
-
자바 제네릭(Generic) - 제네릭 메서드와 타입 범위 한정 TOP NEW
안녕하세요 커널360 1기 크루 우무룡입니다. 기술세미나 발표주제로 익숙하면서도 헷갈릴 수 있는 제네릭을 선정했습니다. 기본적인 개념에 대해 간단히 알아보고 개인적으로 헷갈렸던 제네릭 메서드와 타입 범위 한정에 대해 주로 알아보겠습니다! 제네릭이란 자바에서 제네릭은 타입 안정성을 위해 jdk 1.5부터 도입된 문법이다. 클래스 내부에서 사용할 데이터 타입을 클래스 내부에서 선언하는 것이 아닌 외부에서 사용자에 의해 지정하는 기법이다. ArrayList<String> list = new ArrayList<>(); 저 꺾쇠 괄호가 바로 제네릭이다. 괄호 안에는 타입명을 기재한다. 그러면 저... Read More
-
Fixture Monkey TOP NEW
안녕하세요. 저는 이번 Kernel360의 기술세미나에서 Fixture Monkey를 주제로 발표하게된 손현준입니다. Fixture Monkey는 2023년 10월 네이버 오픈소스로 1.0.0 버전으로 release 되었습니다. Fixture Monkey 네이버페이 Platform lab에서 만든 PBT(Property Based Testing) 도구로 실제 네이버 사내에서 활용중인 도구입니다. 1. Fixture Monkey 소개 Fixture Monkey는 제어 가능한 임의 테스트 개체를 쉽게 만들도록 설계된 Java 및 Kotlin 라이브러리입니다. 필요한 테스트 픽스처 생성을 쉽고 빠르게 도와... Read More
-
STOMP 웹소켓 프로그래밍 TOP NEW
안녕하세요. 저는 STOMP 웹소켓 프로그래밍이라는 주제로 발표한 문찬욱입니다. 저는 이번 프로젝트에서 채팅 기능을 구현하고 있는데요, 그 과정에서 사용한 기술에 대해 공유드리고자 이 주제를 선정했습니다. 이 글에서 웹소켓이 무엇인지, http와 웹소켓의 차이점이 무엇인지, 웹소켓 동작 방식은 어떤지, STOMP이 무엇인지 알려드리고자 합니다. 1. 웹소켓 웹소켓은 http 환경에서 클라이언트와 서버 사이에 하나의 TCP 커넥션을 통해 실시간으로 전이중 통신을 가능하게 하는 프로토콜입니다. 여기서 전이중 통신은 전화기처럼 양방향으로 송신과 수신이 가능한 통신을 뜻합니다. 2. HTTP vs 웹소켓 ... Read More
-
주저하는 개발자들을 위해 - 코딩 테스트 TOP NEW
코딩 테스트? 코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트다. 회사 입장에서는 지원자를 평가하는 최소한의 기준이고 지원자에게는 통곡의 벽 처럼 느껴지는 코딩 테스트 대체 왜 해야할까? 그리고 또 어떻게 준비해야만 할까..? 코딩 테스트 그래서 왜 해야하나? 무엇보다도, 많은 회사들이 코딩테스트를 1차적인 관문으로 두고 지원자를 거르고 있기 때문에 그런 회사들에 지원할 생각이 있다면 꾸준히 준비하는 게 좋다. 아래 4가지 이유를 통해서 조금 더 자세히 알아보자면.. 여러분들이 가고 싶어하는 많은 회사에는 정말 많은 지원자가 몰린다. 이들 개개... Read More
-
이번엔 Spring REST Docs를 써볼까? TOP NEW
안녕하세요, Lune 입니다. 이번엔 Spring REST Docs를 기술 세미나 주제로 가져와봤는데요. Spring REST Docs를 프로젝트에서 사용하게 된 이유부터 적용기까지 공유해보려고 합니다. 1. API 문서의 필요성 조금 뻔한 얘기로 시작해볼까요? 개발을 하면서 API 문서들이 필요한 이유는 무엇일까요? 제가 생각해봤을 때, 그리고 검색을 해봤을 때 아래와 같은 이유들이 있었습니다. API 사용법 이해 개발자 간의 효율적인 협업 빠른 문제 해결 및 버그 대응 개발 생산성 향상 개인적으로는 일단 2번이 제일 와닿습니다. 협업할 때 같은 API 문서를 보며 얘기하면 소통이 더 ... Read More
-
함수형 프로그래밍 TOP NEW
안녕하세요. 함수형 프로그래밍을 주제로 발표한 장호윤입니다. 보다 친숙한 객체지향 프로그래밍 외에 다른 프로그래밍 패러다임에 대해서 다뤄보고자 이 주제를 선정하게 되었습니다. 프로그래밍 패러다임 함수형 프로그래밍은 프로그래밍 패러다임 중 하나입니다. 프로그래밍 패러다임은 프로그래머가 어떤 관점으로 코드를 작성할지 결정하는 역할을 하는데, 최근의 프로그래밍 패러다임은 크게 아래와 같이 구분할 수 있습니다. 명령형 프로그래밍 절차지향 프로그래밍 객체지향 프로그래밍 선언형 프로그래밍 함수형 프로그래밍 명령형 프로그래밍은 무엇... Read More
-
Spring JPA와 Flyway TOP NEW
안녕하세요, 저는 이번에 Spring JPA와 Flyway를 주제로 기술 세미나를 진행했습니다. 프로젝트에서 협업을 하며 데이터베이스 버전을 관리해야할 때가 있는데요, 변경할 내용이 있을 때마다 직접 문서화를 해줄 경우 번거롭고, 실수할 수도 있습니다. 이런 문제를 해결하기 위해서 어떻게 협업을 할 수 있는지, 이 때 주의해야할 것들이 있는지 등 프로젝트를 겪으며 알게된 내용을 공유하고자 합니다. 더 나아가 SQL과 Spring JPA의 연관관계를 맺는 방법도 비교해보겠습니다 ! 1. Spring JPA란? 스프링 JPA(Java Persistence API)는 자바 ORM(Object-Relational M... Read More
-
생산성을 도와줄 프로그램들 TOP NEW
생산성 향상을 위한 도구들 생산성이란? 좋은 개발 환경 구축 : 효율적인 작업 환경 ex)IDE, 버전관리 도구, 디버깅 도구… 자동화 : 시간을 소모하는(많이)작업을 자동화 하여 시간 단축 코드 품질 관리 : 코드 리뷰, 정적 분석 도구 활용 학습과 성장 : 최신 개발 트렌드 지식 유지 및 기술 향상 작업 관리 : 우선 순위 설정과 같은 체계적으로 단계를 형성하여 관리 이중에서 시간을 아낄 수 있는 효율에 초점을 맞추어 글을 작성하도록 하겠습니다. 목표 목차 JPA Buddy IntelliJ Live Template Github Copilot Octotree ... Read More
-
배포있게 배포하기 -DB편- TOP NEW
다시 돌아온 Docker 세미나 시간입니다. 어쩌다보니 오픈세미나에 이어서 이번 주제도 Docker와 관련한 주제로 선택을 하게 되었는데요. (정말 파도 파도 공부해야 하는 부분이 계속 나오더라구요.) 이전 오픈 세미나에서는 Docker의 기본적인 내용을 설명을 했다면 오늘 설명드릴 내용은 DB replication을 Docker를 통해서 적용해 보고 이를 쉽게 적용할 수 있도록 나온 서비스인 AWS RDS를 통해서 이해하는 시간을 가져보려고 합니다. 그럼 시작해보겠습니다. 1. Docker-Compose는 무엇인가? 아마 Docker를 공부하다 보면 Docker-Compose에 대해서 이름은 들어보... Read More
-
일급 컬렉션이란? TOP NEW
안녕하세요, 지난번 자바의 가비지 컬렉션 발표에 이어서 또 다시 기술 세미나를 맡아 시작하게 되었습니다. 특별히 지난번 가비지 컬렉션 발표에 이어서 또 다른 컬렉션에 대해 발표를 해보면 어떨까? 하는 생각에 (농담입니다) 객체지향에서 크루분들이 어려워하는 개념 중 하나인 일급 컬렉션 에 대해 발표를 진행하기로 하였답니다. 1. 일급 컬렉션(first-class-collection)이란? 일급 컬렉션 에 대한 개념은 마틴 파울러 의 책 소트웍스 앤솔러지 에서 처음으로 제시되었습니다. 규칙 8: 일급 콜렉션 사용 이 규칙의 적용은 간단하다. 콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다... Read More
-
더 나은 테스트로 인도해줄 친구들 TOP NEW
개요 안녕하세요, 커널 360 2차 기술세미나의 포문(for문아님)을 열게된 조형준입니다. 저번 포스팅에선 클린코드에 관한 내용을 다뤘는데요, 이번 포스트는 더 좋은 테스트코드를 도와주는 프레임워크를 소개해드리겠습니다! 테스트코드, 이제 좀 짰어요! ControllerTest.. ServiceTest.. RepositoryTest.. 등등.. 여러 테스트코드를 작성했겠다. 이제 좀 테스트코드를 알 것 같아요! 과연 그럴까? 네.. 테스트 커버리지는 박살이 났습니다. 이대로 출시하게 된다면 뭐.. 결과는 뻔하겠죠 테스트도 일이다. 효율적으로 하자. 이러나저러나, 테스트코드도 어쨌든 공수입니다. 따... Read More
-
도커 찍먹하기 TOP NEW
안녕하세요, 김현지입니다. 이번에는 ‘도커 찍먹하기’라는 주제로 기술 세미나 발표를 하게 되었습니다. 도커를 선택한 이유는 저의 파이널 프로젝트를 배포할 때 도커를 사용할 것이기 때문입니다. 이에 따라 도커에 대한 이해와 익숙함을 기를 필요가 있다고 판단하였습니다. 이 포스팅은 ‘도커’에 대한 깊은 원리를 다루는 것이 아니라 소개 수준으로 이루어질 것이니, 편안하게 따라와 주시면 감사하겠습니다. 처음에는 도커가 무엇인지부터 시작해서, 개발과 배포 과정에 어떻게 변화를 가져오는지 살펴보겠습니다. 도커란 무엇일까요? 도커는 컨테이너를 생성하고 실행할 수 있는 생태계입니다. 생태계라는 표현을 강조한 이유는 도커와... Read More
-
Github Actions TOP NEW
목차 목표 CI / CD란? GithubActions란? workflow? 사용해야하는 이유? 장점 단점 정리 목표 CI / CD, Github Actions이 무엇이고, 어떻게 사용할 수 있는지, 그리고 어떤 장단점이 있는지를 알고 사용하는 것을 목표로 글을 작성합니다. 1. CI / CD란? CI/CD는 Continuous Integration과 Continuous Delivery 또는 Continuous Deployment의 약자로, 소프트웨어 개발에서 흔히 사용되는 방법론입니다. 1-1. Continuous Inte... Read More
-
세션 인증과 JWT를 이용한 토큰 인증 방식 TOP NEW
이번 포스팅에서는 세션과 JWT를 이용한 인증 방식에 대해서 알아보겠습니다. 세션과 JWT를 다루기 전에 먼저 알고 넘어가야하는 중요한 개념이 있는데요, 바로 인증과 인가입니다. 인증과 인가 인증 인증(Authentication)은 쉽게 말해서 로그인 이라고 할 수 있습니다. 클라이언트가 이 사이트에 가입된 회원임이 맞는지 아이디와 패스워드 등을 통해서 말 그대로 인증 받는 것이지요. 예를들어, Github에 이메일과 패스워드를 통해서 로그인을 했다고 가정해본다면 Github 서버는 사용자가 입력한 로그인 정보를 통해서 Github에 가입된 회원이 맞는지 검증하고 확인한 것입니다. 위와 같이 클라이언트가 이 사이... Read More
-
클린코드, 뭐부터 시작해볼까? TOP NEW
개요 안녕하세요, 커널360의 크루로 활동중인 조형준입니다. 이번 기술세미나의 주제는 ‘클린 코드’를 선정해봤습니다. 클린코드는 ‘읽기 쉬운 코드’, ‘협업하기 좋은 코드’ 등과 같은 특징을 가지고 있는데요. 본 포스팅에서 어떤것부터 시작하면 좋을 지 찬찬히 따져보도록 하겠습니다. 클린코드? 개발자 필독도서라고 한번쯤은 들어보셨을 그 책입니다. 책의 이름이기도 하지만, 결과적으로는 좋은코드, 읽기 좋은 코드 등의 의미와 일맥상통한다고 생각합니다. 클린코드에서 말하는 규칙은 여러개가 있는데, 몇가지만 톺아보자면 다음과 같습니다. 함수는 하나의 기능만 나쁜 주석 배제 좋은 함수 이름 철저한 네이밍 ... Read More
-
AWS를 통한 모니터링 TOP NEW
안녕하세요, 저는 이번에 AWS를 통한 모니터링을 주제로 기술 세미나를 진행했습니다. 여러 프로젝트를 통해서 AWS에 서비스를 배포한 경험이 있으신 분들이 계실텐데요, 실제 서비스를 배포한다면 단순히 배포에서 끝나는 것이 아니라 이 후 모니터링을 통해 장애나 서비스 중단 등의 문제가 발생하는지 확인해보아야 합니다. 이번 주제에서는 AWS가 제공하는 서비스를 통해, 모니터링을 어떻게 할 수 있는지에 대해 알아보겠습니다. 1. AWS Amazon Web Services 아마존(Amazon)에서 제공하는 클라우드 서비스로, 네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등 다양한 서비스를 제... Read More
-
RDBMS의 조회과정, 쿼리실행계획 중요성 TOP NEW
RDBMS의 조회과정, 쿼리실행계획 중요성 반갑습니다. RDBMS와 쿼리실행계획의 중요성을 주제로 기술세미나 발표를 한 정지용 입니다. [1. 개요] 요즘 자바와 ORM을 기반으로 개발을 하게되어 직접적으로 쿼리를 보는 일이 예전보다 현저히 줄어들었다고는 하나 아직도 데이터가 저장되는 저장소는 대부분 데이터베이스입니다. 결국 그 말은 즉슨 아무리 데이터베이스에 의존을 최소화 하더라도 어쩔 수 없이 데이터베이스에 대해 잘 알아야 한다는 이야기이기도 합니다. 이번 시간에는 RDBMS에서 다양한 기능을 많이 지원하지만 가장 많이 쓰이는 조회과정과 이와 연관되어있는 쿼리실행계획의 중요성을 알아보는 시간을 가져보고... Read More
-
CORS TOP NEW
CORS.. 웹개발을 하시다보면, 한번쯤은 마주해본 이슈라고 생각합니다. 처음 마주했을 때, 정말 어떤 개념인지 (Spring에서) 어떻게 해결해야 할지 헤맸던 경험이 있어, 제가 학습하고 이해한 CORS에 대해 설명해보고자 합니다. CORS란? CORS란 “Cross-Origin Resource Sharing”의 약자로, 웹 애플리케이션에서 다른 도메인 간에 데이터를 공유할 수 있도록 하는 보안 기술을 뜻합니다. 한번에 와닿지 않는 개념이기 때문에, 이어지는 개념들을 접하고 나서 다시 이해해보도록 합시다! SOP란? CORS의 반대되는 개념으로 SOP가 있습니다. “Same-Origin Polic... Read More
-
자바의 입력 Scanner, InputStream, BufferedReader TOP NEW
안녕하세요 커널360 1기 크루 우무룡입니다. //Scanner Scanner sc = new Scanner(System.in); //BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 백준에서 코딩테스트 문제를 푼 경험이 있으시다면 위와 같이 객체를 생성해서 입출력을 다뤄보셨을 것 입니다. 흔히 기본 문법을 배울때 배우는 Scanner를 사용하다가 자연스레 BufferedReader에 대해서도 알게됩니다. 두 클래스 모두 표준입력으로 부터 입력을 받아오는 역할은 같으나, 인스턴스화 하는 형태뿐만 아니... Read More
-
N+1 TOP NEW
안녕하세요. N+1 주제로 발표하게 된 홍주광입니다. 사례 먼저 보시겠습니다. 클라이언트에서 서버로 초당 5회의 요청을 보냈고 평균 30ms속도로 응답을 받았습니다. 조금 더 올려볼까요? 초당 1000회의 요청을 보내봤습니다. 어떻게 되었을까요? 초당 1000회의 요청을 보냈고 평균 4000ms속도의 응답을 받았습니다. 서버는 과부하가 되었습니다. 왜 이런 현상이 벌어졌을까요? 바로 이 사례에서는 N+1 문제 때문이였습니다. (물론 항상 위 현상이 N+1 문제로 일어나는 것은 아닙니다..) 그만큼 N+1 문제가 서버에 영향을 줄 수 있다는 뜻입니다. N+1 N+1 문제란 무엇일까요? ... Read More
-
데이터베이스 정규화 초급 TOP NEW
10분 기술세미나 주제: 데이터베이스 정규화 안녕하세요. 커널360 백엔드 1기 4셀 신종민입니다. 제가 이번에 준비한 발표 주제는 데이터베이스의 정규화에 관한 내용입니다. 부트업과 해커톤, 그리고 End to End 프로젝트를 거치면서 데이터베이스에 대해서 모르는 점이 많다는 점을 깨달았습니다. 파이널 프로젝트 외에도 앞으로도 백엔드 개발자로서 반드시 알아야 한다는 점을 깨닫고 데이터베이스에 대해 잘 알고싶어 발표 주제를 정하게 되었습니다. 1. 정규화의 정의 정규화란 무엇일까요? 위키피디아에서는 다음과 같이 나왔습니다. 관게형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스... Read More
-
실시간 웹 애플리케이션을 위한 API 전략 TOP NEW
안녕하세요, Lune 입니다. 저는 이번에 실시간 웹 애플리케이션을 위한 API 전략이라는 주제로 기술 세미나를 진행했습니다. 이 주제를 통해 REST, GraphQL, WebSocket API에 대해 주로 설명하고 각각을 비교해보려고 합니다. 1. API란 먼저 API(Application Programming Interface)가 무엇인지 간단히 알아볼까요? 우선 Application은 고유한 기능을 가진 모든 소프트웨어, Interface는 애플리케이션 간의 서비스 계약이라고 할 수 있습니다. 그리고 계약은 요청과 응답을 사용하여 애플리케이션이 서로 통신하는 방법이라고 할 수 있죠. 좀 더 쉬운 설명... Read More
-
Spring Security Authentication 구조 훑어보기 TOP NEW
안녕하세요. 스프링 시큐리티의 전체적인 인증 구조에 대해서 발표할 안소현입니다. 스프링 시큐리티, 무엇일까요? 스프링 시큐리티는 스프링 기반의 애플리케이션 보안을 담당하는 스프링 하위의 프레임워크입니다. 우리가 시큐리티 로직을 짤 때 흔히 인증과 인가으로 나눌 수 있죠. 인증(authentication)은 사용자의 신원을 입증하는 과정으로 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정이고 인가는 사이트의 특정 부분에 접근할 수 있는지에 대한 권한을 확인하는 작업이죠! 앞으로 발표할 내용은 spring docs에 나와있는 내용을 기반으로 작성되어 있습니다. 스프링 시큐리티 독스에는 정말 많은 내... Read More
-
스프링과 데이터 영속성(Persistence) TOP NEW
안녕하세요. 저는 이번 Kernel360의 기술세미나에서 자바진영에서의 데이터 영속성이라는 주제로 발표하게된 김원상입니다. 데이터 영속성은 Layered-Architecture의 가장 밑단의 Data Layer와 Domain Model사이를 잇는 Persistence계층에 대한 내용이라 보시면 되겠습니다. 1. 데이터 영속성이란? 데이터 영속성은 어플리케이션이 닫혀도 그로 인해 생성된 데이터가 비휘발성(non-volatile) 저장소에 기록되어 사라지지 않는 것을 의미합니다. 간단하게 말씀드리자면, 세션의 열고 닫음 사이에도 어플리케이션에서 생성된 데이터가 DB와 같은 영속적인 저장소에 입력되어 다음 세... Read More
-
시간 복잡도 TOP NEW
안녕하세요. 저는 이번 Kernel360의 기술세미나에서 시간 복잡도라는 주제로 발표하게 문찬욱입니다. 아마 다들 e2e하면서 DTO로 데이터를 이렇게도 바꿔보고 저렇게도 바꿔보셨을 것 같은데요. 저는 이 과정에서 시간 복잡도를 개선할 수 있다면 이 후, 서비스 성능면에서 좋은 영향을 주지 않을까라는 생각에 이 주제를 선정했습니다. 시간 복잡도에 대해 이야기 하기 전에 알고리즘에 대해 간단히 설명드리겠습니다. 1. 알고리즘 어떤 문제나 목적을 달성하기 위해 거쳐야 하는 여러 과정들을 의미합니다. 이 과정들은 다양하고, 상황에 따라 알고리즘은 모두 다릅니다. 따라서 상황에 맞게 성능이 좋은 알고리즘을... Read More
-
Https 누구냐 넌? TOP NEW
안녕하세요. 저는 이번 Kernel360의 기술세미나에서 Https를 주제로 발표하게된 손현준입니다. HTTPS는 인터넷을 통한 안전한 데이터 전송에 사용되는 보안 버전의 HTTP입니다. Https를 통해 데이터 개인 정보 보호 및 보안을 보호하기 위해 정보를 암호화합니다. 1. Https 란? 우리가 인터넷에서 자주 사용하는 인터넷 주소를 살펴보면, 프로토콜, 호스트(도메인), 포트번호, 경로, 쿼리값 등으로 이루어져 있습니다. 이 중 가장 앞부분에 자리하고 있는 http 부분을 hyper text Protocol 이라고 부릅니다. 하이퍼 텍스트 프로토콜이 무엇일까요? 프로토콜은 쉽게 말해, 인터넷 상에... Read More
-
Dispatcher Servlet TOP NEW
안녕하세요, 첫 주의 마지막 기술세미나를 맞게 된 손민우입니다. 자료를 준비하고 발표 연습을 하면서 우여곡절이 정말 많았습니다. (발표가 끝난 지금도 생각하면 떨리네요.) 주제를 선택하면서 가장 기본적인 부분에 대해 설명하고 싶었어요. 그래서 Controller에 대해 검색하다 알게 된 Dispatcher Servlet에 대해 발표해보면 어떨까하는 생각을 했던 것 같습니다. 그래서 이번 기술 세미나에서는 MVC의 흐름도에서부터 시작하여 Dispatcher Servlet, 마지막으로 Servlet에 대해 알아보고 결론적으로 개발자에게 어떤 도움을 주는지 알아볼까 합니다. 그럼, 시작해보겠습니다. 1. Spri... Read More
-
쉽게 이해하고픈 객체지향 TOP NEW
안녕하세요. 쉽게 이해하고 싶은 객체지향이라는 주제로 세미나를 진행한 크루 김찬규입니다. “쉽게 이해하고 싶은” 이라는 키워드를 보면 아시겠지만 제가 객체지향설계를 너무나도 잘 알아서 발표를 하는 것이 아니라 객체지향을 설명하고자 할 때 어려움을 겪는 제 모습을 발견한 것이 주제 선정의 계기가 되었습니다. 객체지향을 잘 이해하고픈 마음으로 공부하는 과정에서 얻은 내용들을 크루 여러분께 공유해 드리고자 합니다. 객체지향 패러다임 패러다임 먼저, 객체지향프로그래밍을 이해하려면 패러다임 이 무엇인지 알아야합니다. 패러다임이란 한 시대의 사회 전체가 공유하는 이론, 방법과 문제의식 등의 체계 를 의미하는데요, 이는... Read More
-
메시지 지향 미들웨어 TOP NEW
메시지 지향 미들웨어란 ? 메시지 지향 미들웨어(Message-Oriented Middleware) 는 시스템과 시스템간의 데이터 통신을 위한 소프트웨어, 즉 메시지라는 정보의 단위를 주고 받을 수 있게 하는 중간의 매개체 시스템입니다. 여기서 메시지 지향 미들웨어는 메시지 브로커와 같은 것들을 포함하는 매우 큰 단위로 메시지 브로커로 잘 알려진 Apache Kafka, RabbitMQ, ActiveMQ를 가지고 있습니다. 위에서 소개한 메시지 브로커들을 이해하려면 해당 브로커들에서 사용 중인 메시지 모델에 대한 이해가 필요합니다. 메시지 모델 메시지 모델에는 크게 두 가지로 나눌 수 있습니다. Mes... Read More
-
자바의 가비지 컬렉션 TOP NEW
안녕하세요, 이번에 Kernel 360 과정에 참여하게 되면서 기술 세미나를 맡아 준비하게 되었는데요. 거의 대부분의 팀들이 Java 와 Spring Framework 환경으로 프로젝트를 진행하고 있었습니다 (역시,, 자바민국) 그로 인해, 자바라는 언어를 처음 접하는 크루들도 굉장히 많았는데요. 그래서 이번 기술 세미나를 통해 자바의 장점을 설명하고 싶었어서 자바의 가비지 콜렉션(GC) 에 대해 발표를 하기로 하였습니다. 첫 블로그 글이라 기대가 되는데요, 가비지 콜렉션에 대해 함께 알아보도록 하겠습니다! 1. 가비지 콜렉션이란? #include <stdio.h> #include <std... Read More