Tecoble

woowacourse code review & devlog

    다중 이미지 업로드 최적화: 병렬 스트림과 CompletableFuture cover image
    #parallelism

    다중 이미지 업로드 최적화: 병렬 스트림과 CompletableFuture

    사이드 프로젝트로 sns 서비스를 개발하며 사용자가 다수의 이미지를 업로드하는 기능을 개발하게 되었다. 웹 애플리케이션에서 다중 이미지 업로드는 일반적이며, 이를 효율적으로 처리하는 것은 사용자 경험 향상에 중요한 역할을 한다. 그렇다면 서버 측에서…

    JPA가 Fetch Join에 대한 On절을 지원하지 않는 이유 cover image
    #JPA

    JPA가 Fetch Join에 대한 On절을 지원하지 않는 이유

    JPA가 Fetch Join에 대한 On절을 지원하지 않는 이유 집사의고민 프로젝트에서 조회 쿼리가 발생할 때 데이터가 삭제되는 상황이 발생하였습니다. 그래서 이번 글에서는 간단한 JPA의 Fetch Join 동작 원리와 유의해야 하는 부분들에 관해…

    데이터베이스 복제하기(리플리케이션) 2 - 테코와 알아보는 대규모 데이터 관리 cover image
    #Database

    데이터베이스 복제하기(리플리케이션) 2 - 테코와 알아보는 대규모 데이터 관리

    테코의 고민 2 - 이벤트에 어떤 내용을 기록해야 해? GTID 기반의 안정적인 복제 방식을 도입한 후 잘 운영되는 카페를 보며 행복한 나날을 보내는 테코. 그런데 어느 날, 데이터베이스에 저장된 회원 데이터를 전체적으로 업데이트하는 작업을 하던 …

    데이터베이스 복제하기(리플리케이션) 1 - 테코와 알아보는 대규모 데이터 관리 cover image
    #Database

    데이터베이스 복제하기(리플리케이션) 1 - 테코와 알아보는 대규모 데이터 관리

    일상을 공유하는 작은 카페 사이트를 직접 개발해 운영하고 있는 테코(1세). 사이드 프로젝트로 만든 카페에 많은 사람들이 들어와 응원의 글을 남기자 테코는 행복해해요. 그런데 어느 날! 카카오톡에 ‘귀염둥이 우테코’ 신상 이모티콘이 출시되고, 이 …

    로컬에서도 프로덕션과 유사한 환경에서 테스트할 수 없을까? : Testcontainers 도입기 cover image
    #Test

    로컬에서도 프로덕션과 유사한 환경에서 테스트할 수 없을까? : Testcontainers 도입기

    우아한테크코스 레벨3과 레벨4 동안 프로젝트를 진행하면서, 로컬 테스트 환경과 실제 운영 환경이 다른 기술적 어려움을 겪었습니다. 해당 어려움으로 비롯된 문제 상황과 단계적 해결 방안, 그리고 최종 해결 방안으로 도입한 에 대한 소개와 사용법을 공유…

    useLayoutEffect를 활용한 산발적 마커 렌더링 최적화 cover image
    #useLayoutEffect

    useLayoutEffect를 활용한 산발적 마커 렌더링 최적화

    마커 렌더링 최적화 서비스 소개 마커 렌더링 최적화 설명에 앞서 잠시 저희 팀에서 진행했던 서비스에 대해 소개드리겠습니다. 저희 서비스의 출발점은 이었습니다. 최근 들어 보조금과 저렴한 유지비용 등의 이유로 전기차의 수요는 점점 증가하고 있습니다. …

    웹 어플리케이션의 역사 cover image
    #Web

    웹 어플리케이션의 역사

    들어가면서 백엔드 개발자라면 웹 어플리케이션이라는 개념을 자주 접하게 됩니다. 그렇지만 웹 어플리케이션이 왜 등장했는지, 어떻게 지금의 형태에 이르렀는지에 대해 답하기는 쉬운 일이 아닐 것입니다. 좋은 엔지니어는 기술 그 자체에 매몰되는 것이 아니라…

    어떤 경우에 한 방 조인 쿼리와 여러 개 쿼리 분리를 고려할 수 있을까? cover image
    #query

    어떤 경우에 한 방 조인 쿼리와 여러 개 쿼리 분리를 고려할 수 있을까?

    최근에 프로젝트에서 리팩토링과 동시에 쿼리 개선을 하고 있는데요. 조인 한 방 쿼리로 한 번에 끝내는 게 여러 번 네트워크 타는 것보다 좋을 것 같아서 한 방 쿼리로 수정하고 있다가 다음과 같이 모든 쿼리가 조인이 덕지 덕지 붙어있는 코드를 보고 뭔…

    레이어드 아키텍처에서 이미지 업로드하기 cover image
    #ANDROID

    레이어드 아키텍처에서 이미지 업로드하기

    [Android] 레이어드 아키텍처에서 이미지 업로드하기 배경 저는 현재 ‘나아가’라는 우테코 프로젝트와 ‘ZOOC’이라는 사이드 프로젝트에서 안드로이드 개발을 담당하고 있습니다. 두 프로젝트에서 모두 이미지 업로드를 위해 를 사용하고 있습니다. 프…

    공간 데이터 개념부터 적용까지 cover image
    #JPA

    공간 데이터 개념부터 적용까지

    들어가며 성수동에 위치한 힙하고 트렌디한 카페를 쉽게 찾을 수 있는 요즘카페 서비스에 지도 기능을 추가하기로 했다. 기능 개발을 위해 공부하던 중 공간 데이터에 대해 알게 되었다.. 공간 데이터는 좌표계를 통한 지리적인 위치 데이터를 의미한다. 좌…

    JPA Cascade는 무엇이고 언제 사용해야 할까? cover image
    #JPA

    JPA Cascade는 무엇이고 언제 사용해야 할까?

    들어가면서 JPA를 사용한 개발을 진행하면서 가장 많이 들었던 고민 중 하나는 였습니다. ‘Cascade는 위험하니 조심해서 사용해야 한다!’ 와 같은 이야기도 많이 들었을뿐더러, 언제 어떻게 사용해야 할지 명확한 가이드라인을 찾기도 어려웠기 때문…

    전송 제어 프로토콜이란? cover image
    #Network

    전송 제어 프로토콜이란?

    OSI 7계층과 전송제어 프로토콜 데이터 통신은 여러 단계로 진행되는데, OSI 참조 모델은 그 과정을 7개 계층으로 나눈다. 1계층(물리 계층)은 ‘케이블이 연결된 상대에 대한 전기·기계적 신호 전달’ 제어를 담당한다. 2계층(데이터링크 계층)은 …

    무한스크롤 기능에서 동시성 이슈 해결하기 cover image
    #concurrency

    무한스크롤 기능에서 동시성 이슈 해결하기

    안녕하세요. 우아한테크코스 5기 BE 연어입니다. 팀 프로젝트에서 열심히 라는 서비스를 만들고 있습니다. 요즘카페는 스크롤 내리면서 성수동의 카페들을 하나씩 볼 수 있는 숏폼 형식의 서비스입니다. 최근에 무한 스크롤 기능을 추가하면서 예상치 못한 동…

    낙관적 업데이트로 사용자 경험을 개선해보자! cover image
    #TanStack Query

    낙관적 업데이트로 사용자 경험을 개선해보자!

    들어가며: 낙관적 업데이트, 왜 필요할까? 장바구니에 상품을 추가했는데, 왜 화면에는 바로 반영되지 않을까? 낙관적 업데이트의 필요성을 처음 느낀 순간은, 기능을 만들 때였습니다. ‘장바구니 상품 추가’를 위해 POST 요청을 보내고, 이에 대한 …

    AWS 로그인부터 시작하는 인프라 구축하기 1편 cover image
    #AWS

    AWS 로그인부터 시작하는 인프라 구축하기 1편

    AWS 로그인부터 시작하는 인프라 구축하기 1편 : AWS 로그인 / EC2 / VPC 이해하기 0. 들어가기 AWS를 처음 접한다면, 아래의 사진(인스턴스 생성 설정)에 나온 이야기들은 별나라 이야기 같을 것입니다. IAM 사용자, EC2 인스…

    AWS 로그인부터 시작하는 인프라 구축하기 2편 cover image
    #AWS

    AWS 로그인부터 시작하는 인프라 구축하기 2편

    AWS 로그인부터 시작하는 인프라 구축하기 2편 : 서브넷 / 보안그룹 / 퍼블릭vs프라이빗 인스턴스 / 라우팅 테이블과 인터넷 게이트웨이 6. 서브넷 이해하기 인스턴스를 생성할 때, 설정한 VPC에 따라 선택할 수 있는 서브넷 목록이 바뀌는 것을 …

    선착순 티켓 예매의 동시성 문제: 잠금으로 안전하게 처리하기 cover image
    #concurrency

    선착순 티켓 예매의 동시성 문제: 잠금으로 안전하게 처리하기

    들어가며 대학 축제 티케팅 서비스 페스타고를 개발하면서 아래와 같은 고민을 하게 되었다. 티켓 오픈 시간에 많은 사용자가 동시에 티켓 예매를 요청하면 어떠한 문제가 발생할까? 그리고 그 문제를 어떻게 해결할 수 있을까? 여기서 가장 중요한 것은 요청…

    JDBC와 DataSource 이해하기 cover image
    #JDBC

    JDBC와 DataSource 이해하기

    JDBC란? JDBC(Java Database Connectivity)는 자바 프로그래밍 언어를 사용해 데이터베이스에 접근할 수 있도록 하는 자바 API이다. 이를 통해서 우리는 데이터베이스에 접속하고, SQL을 실행하고, 이를 통해 데이터를 가져오…

    React 18 - 동시성 렌더링 cover image
    #react

    React 18 - 동시성 렌더링

    들어가며 2022년 3월, React 18이 발표되었습니다. 여러 변경 사항이 있었지만 그 중 핵심은 Concurrency(동시성)입니다. 기존 experimental 버전에서만 동작하던 ‘concurrent mode’를 공식 지원하게 되었고, 따라…

    @Configuration은 어떻게 빈을 등록하고, 싱글톤으로 관리할까? cover image
    #spring

    @Configuration은 어떻게 빈을 등록하고, 싱글톤으로 관리할까?

    어노테이션을 사용해서 빈을 생성하는 방법은 크게 두 가지가 있다. 과 을 사용해 빈 설정 정보 클래스 생성 와 이를 상속한 , 어노테이션등을 사용해 자바 컴포넌트 생성 은 어떻게 빈을 등록하고, 싱글톤으로 관리하는지 알아보자! @Configurat…

    이미지 사이즈 최적화 cover image
    #web

    이미지 사이즈 최적화

    들어가며 사용하고자 하는 서비스의 기능은 잘 구현되어 있지만, 사용자에게 제공하는 시간이 느리다면 좋은 서비스라고 할 수 있을까? 사용자의 경험을 고려해 봤을 때, 기능적인 측면도 중요하지만 다양한 기기와 네트워크 환경에서도 원활하게 제공하기 위해서…

    ExceptionHandler와 ControllerAdvice를 알아보자 cover image
    #spring

    ExceptionHandler와 ControllerAdvice를 알아보자

    콘솔 애플리케이션을 구현할 때, 우리는 예외를 핸들링하기 위해 try / catch문을 사용했습니다. 그러나 웹 애플리케이션에서는 예외 처리 방법이 조금 다릅니다. 이번 글에서는 스프링을 사용한 웹 애플리케이션 적용할 수 있는 예외 처리 방법인 와 …

    DAO와 Repository cover image
    #DAO

    DAO와 Repository

    DAO를 사용해서 DB에 접근할 때, 대부분 DAO 클래스에 Spring의 @Repository를 달아 둡니다. 왜 DAO를 Repository라고 하지? DAO가 Repository의 일종인가? 싶었는데, DAO와 Repository라는 클래스를 …

    데드락 해결 모험기 cover image
    #Mysql

    데드락 해결 모험기

    용어 설명  Cycle이란, 사용자가 특정 챌린지에 도전할 때 생성되는 객체이다. 비즈니스 규칙 상 하루에 한번씩 총 3일을 인증해야 하며, 하루에 여러번 인증을 할 수는 없다. 아직 인증을 하지 않은 상황에서 활동을 인증하게 되면 인증 내역인 Cy…

    AOP에 대한 사실과 오해 그런데 트랜잭션을 사알짝 곁들인.. cover image
    #aop

    AOP에 대한 사실과 오해 그런데 트랜잭션을 사알짝 곁들인..

    들어가며 트랜잭션을 공부하다보면서 자연스럽게 AOP에 대해 접하게 되었습니다. AOP를 사용하게 되면서 직접 경험했던 사실과 오해에 대해서 공유하려고 합니다. 첫 번째 사실: public이외의 메서드는 AOP가 걸리지 않는다. 실제 인텔리제이에서 …

    스프링 이벤트 적용기 cover image
    #spring

    스프링 이벤트 적용기

    상황 스모디 프로젝트를 하면서 랭킹 기능을 도입하기로 했습니다. 랭킹 기능은 유저가 활동을 했을 때, 활동에 따라 랭킹 점수를 부여해야 합니다. 저희 서비스는 챌린지에 도전하고 매일 챌린지에 해당하는 활동을 인증하여 총 3회 인증 시 성공하는 사이클…

    트랜잭션 격리 수준 cover image
    #Transaction

    트랜잭션 격리 수준

    Transaction Isolation Level 애플리케이션을 개발 중 데이터베이스를 도입하면 격리 수준에 대한 이해가 자연스럽게 요구됩니다. 격리 수준은 데이터베이스의 ACID 성질 중 Isolation 에 해당하며, 여러 트랜잭션이 동시에 변경…

    interface vs type alias cover image
    #typescript

    interface vs type alias

    what is the difference between interface and type alias? typescript를 공부해본 사람이라면 위의 키워드를 사용해서 구글링을 해본 적이 있을 것이다. (최소한, 나는 그렇다…🙄) 실제로, 아래와 같…

    무중단 배포 cover image
    #무중단배포

    무중단 배포

    무중단 배포를 도입하게 된 계기 프로젝트를 론칭한 이후, 사용자의 피드백을 반영하다보니 운영 환경으로의 배포가 점차 잦아졌습니다. 문제는 배포를 할 때마다 기존 서버를 내리고 새롭게 띄우는 과정에서 평균 20초 이상의 다운타임이 발생한다는 것이었습니…

    테스트코드 성능 개선기 cover image
    #Test

    테스트코드 성능 개선기

    들어가며 코드를 수정하면, 검토 요청(PR) 과정의 첫 번째에 전체 테스트 코드가 잘 돌아가는지 확인하는 과정이 주기적으로 일어나고 있어요. 혼자 개발하며 테스트 코드를 접했을 때는 비지니스 로직의 안정성을 보장해주고, 문서화 기능도 있어 테스트는 …

    OpenID와 OAuth2.0 cover image
    #OpenID

    OpenID와 OAuth2.0

    요즘 많은 서비스가 소셜 로그인을 지원합니다. 저만 해도 새로운 서비스를 이용할 때, 네이버 또는 카카오 로그인이 있으면 거기에 손이 먼저 가는데요. 번거로운 개인 정보 입력을 생략할 수 있는 소셜 로그인은 사용자 입장에서 참 고맙습니다. 개발자 입…

    JPA의 동적 쿼리 cover image
    #JPA

    JPA의 동적 쿼리

    F12 프로젝트를 진행하면서 검색기능을 개발하는 과정에서 고민했던 부분을 소개해드리려고 합니다. F12 서비스에는 회원을 검색할 수 있는 기능과 제품을 검색할 수 있는 기능이 존재합니다. 이 글에서는 좀 더 복잡한 조건이 들어가 있는 회원을 검색하는…

    Git Merge cover image
    #git

    Git Merge

    와 branch로 merge 관련된 여러 개념을 이해해봅시다!  : base branch : branch에서 나눠진 하위 branch 오늘 생각해볼 내용은 이렇습니다. merge fast-forward merge non fast-forward …

    슬랙 소셜 로그인과 알림을 위한 앱 설치 가이드 cover image
    #slack

    슬랙 소셜 로그인과 알림을 위한 앱 설치 가이드

    슬랙 소셜 로그인과 알림을 위한 앱 설치 가이드 구글, 깃허브, 카카오, 네이버와 같은 서비스는 소셜 로그인을 제공합니다. 슬랙도 해당 기능을 지원하지만 사용자가 많지 않아 한글로 작성된 가이드를 찾기 어렵습니다. 슬랙은 앱을 배포하면 워크스페이스에…

    JPA Hibernate 프록시 제대로 알고 쓰기 cover image
    #JPA

    JPA Hibernate 프록시 제대로 알고 쓰기

    JPA를 사용할 때 장점이 뭘까요? 많은 장점들이 있겠지만, 그 중 하나로 객체 그래프를 통해 연관관계를 탐색할 수 있다는 것을 꼽을 수 있습니다. 하지만 엔티티들은 데이터베이스에 저장되어 있기 때문에 한 객체 조회 시 연관되어 있는 엔티티들을 모두…

    함수 오버로딩 cover image
    #function

    함수 오버로딩

    서언 TypeScript에는 Function Overloading 기능이 있습니다. 이번에 Function Overloading의 강력함을 깨닫고, 이를 공유하고자 아티클을 씁니다. 함수 오버로딩이 왜 필요한지 이해하고, 예시와 저희 프로젝트에 적…

    Spring에서 Server-Sent-Events 구현하기 cover image
    #sse

    Spring에서 Server-Sent-Events 구현하기

    웹 애플리케이션을 개발하다보면 클라이언트의 요청이 없어도 서버에서 데이터를 전달해줘야 하는 경우가 있습니다. 대표적으로 뉴스피드나 댓글 알림처럼 실시간으로 서버의 변경사항을 웹 브라우저에 갱신해줘야 하는 경우를 예로 들 수 있을 것 같습니다. 제가 …

    테스트 자동화 라이브러리 개발기 cover image
    #test

    테스트 자동화 라이브러리 개발기

    cypress-ci는 Cypress 테스트 자동화 라이브러리로, CI Provider에서 서버 실행과 테스트 실행을 자동화하기 위한 여러가지 기능을 지원하고 있습니다. 개발 배경 체크메이트 팀에서는 Jenkins와 Cypress로 빌드 전 E2E 테…

    좋아요 개수 조회 최적화하기 cover image
    #MySQL

    좋아요 개수 조회 최적화하기

    속닥속닥 프로젝트(https://github.com/woowacourse-teams/2022-sokdak)를 진행하면서 현재는 문제가 되지 않지만 시간이 갈수록 데이터가 쌓이면서 문제가 될 수도 있겠다라고 생각한 부분이 있습니다. 게시글에 대한 ‘좋…

    서비스 추상화 cover image
    #service

    서비스 추상화

    😘 서론 우아한테크코스에서 사용하는 협업 도구 중 하나인 은 무료 프리티어 사용 시 3개월이 지난 메시지들을 보여주지 않습니다. 레벨 3 팀 프로젝트인 줍줍에서는 이 사라지는 메시지들을 백업해주는 서비스를 제공합니다. 의 메시지에 대한 정보를 주로 …

    Spring Profile: yml 파일 하나로 프로퍼티 관리하기 cover image
    #spring-boot

    Spring Profile: yml 파일 하나로 프로퍼티 관리하기

    서비스를 개발하다보면 하나의 서버 애플리케이션을 다양한 환경에서 실행할 일이 생깁니다. 그리고 H2 DB를 사용하는 테스트 환경과 MySQL DB를 사용하는 배포 환경에서 사용되는 환경변수 값이 서로 다른 것은 당연한 일이겠죠. 해당 글에서는 일반적…

    공식 팀에서의 에러 헨들링 cover image
    #React

    공식 팀에서의 에러 헨들링

    현재 팀에서의 에러 핸들링 공식에서 비동기 통신에 대하여 제대로 된 에러 관리 방식이 없어서 잡지 못하는 에러도 많았고, 컴포넌트내에 에러 로직이 무더기로 있는 경우가 있었다. 그래서 지금부터 공식팀이 에러를 처리한 방식에 대해서 알아볼 것이다! 일…

    Life of Pixel cover image
    #composite

    Life of Pixel

    이 글은 Google Chrome 개발자 Steve Kobes의 Life of Pixel영상을 보고 정리한 내용입니다. 사용된 이미지들은 Steve Kobes의 허락 하에 slide show에서 가져왔습니다. 이 글의 목표 어떤 과정을 통해 HTML…

    이론과 실습을 통해 이해하는 Docker 기초 cover image
    #docker

    이론과 실습을 통해 이해하는 Docker 기초

    본 포스팅은 도커에 대한 자세한 개념, 도커 기본 명령어, 컨테이너 실행 실습, 도커 컴포즈, 도커 이미지 빌드, 도커 허브에 이미지 배포 등 전반적인 도커 기초에 대한 내용을 다룬다. 도커 (Docker) 도커는 컨테이너 기반의 오픈소스 가상화 플…

    트랜잭션 내에 외부 리소스 요청이 담기게 되면 어떤 문제가 발생할까? cover image
    #transactional

    트랜잭션 내에 외부 리소스 요청이 담기게 되면 어떤 문제가 발생할까?

    트랜잭션 처리를 위해서는 데이터베이스와 통신하기 위한 이 필요하다. 하지만 커넥션 생성을 위해서 많은 비용이 필요하다. 이러한 비용을 절감하기 위해 커넥션을 미리 생성한 뒤 을 통해 관리한다. 커넥션 풀의 개수는 되어 있다. 만약 동시에 데이터베이스…

    이미지 스토리지 서버 구축 및 최적화 cover image
    #nginx

    이미지 스토리지 서버 구축 및 최적화

    레벨 3 프로젝트 과정 중 이미지 서버를 개발하고 개선해나가는 과정을 이야기하려 합니다. 왜 이미지 서버를 만들어야 하는가? 레벨 3 프로젝트인 공책에서는 특정 공간에 관해서 설명하는 이미지를 올려 보여주어야 합니다. 글보다는 이미지를 제공함으로써 …

    HashMap vs HashTable vs ConcurrentHashMap cover image
    #hashmap

    HashMap vs HashTable vs ConcurrentHashMap

    이미지 출처: Top 35 Data Structure & Algorithms Interview Questions and Answers in 2021 각 자료구조는 필요에 따라 선택되고 활용된다. 인터페이스의 구현체로는 , , 등이 있다. Map …

    SpringBoot 존재하지 않는 API 요청의 응답 커스마이징하기 cover image
    #springboot

    SpringBoot 존재하지 않는 API 요청의 응답 커스마이징하기

    SpringBoot 에서 존재하지 않는 api 요청에 대한 에러메시지를 커스터마이징한 과정을 소개한다. 배경 프로젝트를 진행하면서 api의 url을 실수로 잘못 입력했을 때, 에러의 원인을 확인하지 못해 디버깅 과정에 많은 시간을 사용했다. 이런 상…

    웹어셈블리(WebAssembly)에 대해 알아보자 cover image
    #WebAssembly

    웹어셈블리(WebAssembly)에 대해 알아보자

    최근에 Developer-Roadmap을 둘러보다 라는 개념에 대해 접하게 되었다. 웹 개발을 공부하는 입장에서 처음 접하는 용어에 대한 호기심이 생겼고, 이번 시간을 통해 에 대해 함께 알아보려고 한다. 웹어셈블리 는 2017년에 처음 발표되었고,…

    DIP : 변경에 유연하고 테스트하기 좋은 코드 설계 cover image
    #solid

    DIP : 변경에 유연하고 테스트하기 좋은 코드 설계

    1. 들어가며 클린 코드 관련 저서들이 공통적으로 강조하는 내용은 단연 변경에 유연하고 테스트하기 좋은 코드의 중요성입니다. 소프트웨어는 항상 변경이 발생하기 쉽습니다. 요구 사항이 변경될 때마다 코드를 대거 수정해야 한다면 유지보수 측면에서 좋지 …

    함수형 인터페이스와 람다를 이용한 코드 중복 제거 cover image
    #functional-interface

    함수형 인터페이스와 람다를 이용한 코드 중복 제거

    코드를 작성하다 보면 비슷한 로직의 중복 코드가 생길 수 있고, 그로 하여금 관리 지점이 늘어나기 때문에 대부분 리팩터링의 대상으로 취급한다. 이번 글에서는 함수형 인터페이스와 람다에 대해 알아보고, 이를 이용해 코드의 중복을 제거하는 방법을 다룰 …

    리액트에서 도넛 차트를 만들어보자! cover image
    #chart

    리액트에서 도넛 차트를 만들어보자!

    리액트에서 도넛 차트를 만들어보자 목차 도넛 차트 Canvas? DIV? SVG? stroke-dasharray stroke-dashoffset 직접 만들어보기 애니메이션 keyframes 도넛 차트 Canvas? DIV? SVG? 도넛 차트는 Ca…

    웹 소켓에 대해 알아보자! - 테스트 편 cover image
    #websocket

    웹 소켓에 대해 알아보자! - 테스트 편

    이 글은 웹 소켓으로 만든 채팅방을 어떻게 테스트할지 고민하는 독자를 위해 작성되었다. 웹 소켓은 어떻게 테스트하면 좋을까? Babble 팀의 데모데이 날 부스에서 질문을 받았다. “웹 소켓은 테스트를 어떻게 해야 할 지 감이 안 잡히는데 어떻게 구…

    쿠버네티스 입문하기 cover image
    #infra

    쿠버네티스 입문하기

    기존에 웹 서버를 이용해 로드밸런싱, 포트포워딩, 헬스체킹, 무중단 배포 등 안정적인 인프라를 구성하고 있었다. 지금의 인프라 구조도 좋은데 쿠버네티스라는 기술을 적용함으로써 얻는 이점은 무엇일까? 이미지가 변경되면 기존 컨테이너를 새로운 컨테이너로…

    Hash와 HashMap cover image
    #hashmap

    Hash와 HashMap

    서비스를 개발하거나 알고리즘, 자료구조를 공부하면서 Map, Set 등의 자료구조를 자주 이용했었다. Map 이나 Set 자료구조를 사용하면 자료의 양이 엄청 많아도 검색하는데 O(1) 만큼의 시간복잡도를 가지게 된다. 이렇게 빠른 검색을 위해 Ma…

    당신의 컴포넌트는 안녕하신가요 cover image
    #component

    당신의 컴포넌트는 안녕하신가요

    ❗ 원지혁님의 컴포넌트, 다시 생각하기에서 얻은 인사이트를 정리한 글임을 밝힙니다. ❗ 필자의 생각도 많이 들어가 있으니 원본 영상도 함께 보는 것을 추천합니다! 🎯 개요 당신의 컴포넌트는 안녕하신가요? 조금 관심을 끌기 위한 멘트로 글을 시작했는데…

    Ubuntu PPA 저장소 관리 cover image
    #linux

    Ubuntu PPA 저장소 관리

    서버를 구성할 때, 필요한 프로그램들을 공식 저장소를 통하여 보통 설치하게 됩니다. 하지만 저장소에 모든 프로그램 설치 데이터가 존재하진 않습니다. 다른 버전을 설치해야 할 때도 있을 것이고, 아예 등록되어 있지 않은 프로그램을 설치해야 할 때도 있…

    로드 밸런싱에 대해 알아보자! cover image
    #load-balancing

    로드 밸런싱에 대해 알아보자!

    인터넷의 발달로 인해 데이터 통신이 활발해졌고, 이는 트래픽의 폭발적인 증가로 이어졌다. 방금 누른 페이스북 ‘좋아요’와 친구에게 카톡으로 전송한 동영상, 좋아하는 유튜버의 채널 시청까지 어느 것 하나 인터넷을 통하지 않은 것이 없을 정도이다. 그 …

    SpringBoot 예외 처리에 관한 고찰 cover image
    #springboot

    SpringBoot 예외 처리에 관한 고찰

    SpringBoot는 다양한 예외 처리 방법을 제공한다. 편리한 만큼 궁금증도 많이 들었던 예외처리 부분을 코드를 들춰보는 게 익숙해진 지금 파헤쳐보고자 한다. ExceptionHandler를 사용해 본 경험이 있는 독자에게 추천한다. 다양한 Spr…

    브라우저 렌더링 과정 이해하기. cover image
    #browser-rendering

    브라우저 렌더링 과정 이해하기.

    최근에 백엔드 팀원들과 CS공부를 하면서, 주소창에 을 입력했을 때 일어나는 일에 대해 공부하였다. 이때 백엔드 팀원이 받아온 HTML 파일은 어떻게 브라우저에 그려지는지 물어보았는데, 명확하게 답을 하지못해서 내가 아직 브라우저 렌더링 과정을 정확…

    SVG viewBox를 알아보자 cover image
    #svg

    SVG viewBox를 알아보자

    목차 SVG란 viewBox란 의미 기본 예시 위치 조정 예시 확대, 축소 예시 SVG란 SVG에 대해서 간단하게 알아보자. SVG란 Scalable Vector Graphics의 약자로 , 다시 말해 이라고 할 수 있다. 여기서 이라는 의미는 우리…

    Flyway cover image
    #database

    Flyway

    깃-들다 프로젝트를 진행하며 DB 형상관리를 위해 Flyway를 도입했다. 여기서 와 가 무엇일까? 이번 글에서 한번 알아보자. Flyway? Flyway 공식 문서에서는 Flyway를 다음과 같이 소개한다. Flyway is an open-sour…

    🔒 Java 로 동기화를 해보자! cover image
    #java

    🔒 Java 로 동기화를 해보자!

    이 글에서는 상호배제를 통한 동기화를 알아볼 것이다. 동기화는 프로세스(스레드)가 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치하는 것인데, 쉽게 말해 프로세스 간 데이터가 일치하도록 하는 것이다. 이러한 동기화 메커니즘인 상호배제는 프로세…

    초심자를 위한 React Testing Library cover image
    #react-testing-library

    초심자를 위한 React Testing Library

    React Testing Library(이하 RTL)는 구현 기반의 테스트 도구인 Enzyme의 대안으로 자리 잡은 테스트 도구입니다. 따라서 RTL은 세부적인 구현사항보다는 실제 사용자 경험과 유사한 방식의 테스트를 작성할 것을 권고합니다. 예를 …

    refresh token 도입기 cover image
    #refresh token

    refresh token 도입기

    ❗ SSR 상에서 refresh token을 도입하면서 느낀 것들을 작성한 글입니다. ❗ SSR에서 로그인이 어떻게 이루어지는지 궁금하시면 여기를 참고해주세요! 도입 계기 - 2시간이 지나면 로그인이 풀린다! 현재 진행하고 있는 놀토 앱은 acces…

    동기와 비동기 with webClient cover image
    #asynchronous

    동기와 비동기 with webClient

    ‘여기서 만나’ 프로젝트를 진행하면서 초반에는 RestTemplate을 통하여 외부 API와 데이터를 주고받았다. 이후 WebClient가 비동기 방식으로 쓰여 더 좋다고 하여 WebClient로 변경했다. 그리고 이전 글에서 RestTemplate…

    Spring Data Elasticsearch 설정 및 검색 기능 구현 cover image
    #database

    Spring Data Elasticsearch 설정 및 검색 기능 구현

    실습 Repository에서 코드를 확인할 수 있습니다. 1. Elasticsearch Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful 검색 및 분석 엔진입니다. 방대한 양의 데이터에 대해 실시간으로…

    리눅스 파일 시스템 경로 구조 cover image
    #linux

    리눅스 파일 시스템 경로 구조

    작성한 프로그램을 서버를 통해서 배포 시에 리눅스를 많이 사용합니다. 이 때, 리눅스를 잘 활용하기 위해서 리눅스의 각각의 경로(directory, 디렉터리)에 접근하여 작업할 때도 있습니다. 하지만 명령어를 따라치면서 어떤 의미를 가졌는지 쉽게 파…

    SpringBoot AutoConfiguration을 대하는 자세 cover image
    #springboot

    SpringBoot AutoConfiguration을 대하는 자세

    SpringBoot의 AutoConfiguration은 정말 편리하게 의존성만 추가해주면 관련된 기능들이 모두 설정된다. 편리한 만큼 이를 커스터마이징하는 데는 주의가 필요하다. 이 글에서는 Spring AutoConfiguration의 간단한 원리…

    커버링 인덱스 cover image
    #database

    커버링 인덱스

    조회 성능 개선 미션을 진행하며 를 알게 됐다. 처음 보는 단어여서 이게 어떤 인덱스일까 궁금했고, 바로 찾아보고 이해했다. 그러면서 한번 내용을 글로 정리하면 좋을 것 같다는 생각을 했다. 그래서 이번 기회에 학습 테스트를 하며 해당 개념을 잡고가…

    Scale-up과 Scale-out에 대해 알아보자! cover image
    #scale-up

    Scale-up과 Scale-out에 대해 알아보자!

    서비스를 제작하고, 성공적으로 배포까지 마쳤다. 운 좋게도 점점 많은 유저가 유입되기 시작했고, 수많은 유저가 동시접속하는 서비스가 되었다. 기쁨도 잠시, 문제가 생겼다. 기존에 사용하던 서버가 한계에 도달했다. 인프라를 확장해야 할 필요성을 느끼게…

    CI/CD가 뭔가요? 실전편 cover image
    #infra

    CI/CD가 뭔가요? 실전편

    지난번 CI/CD가 뭔가요? - 이론편에서 CI/CD에 대해서 알아보았다. 이번 글에서는 jenkins를 이용해 하나의 CI/CD 환경을 구축하는 방법에 대해 알아보는 시간을 갖도록 하겠다. 개선 근로에서 구현한 리뷰 매칭 프로그램 을 젠킨스를 통해…

    리액트 쿼리로 에러처리하기 cover image
    #error-handling

    리액트 쿼리로 에러처리하기

    현재 팀 프로젝트를 진행하고 있는 놀토 팀에서는 를 통해서 에러 처리를 하고 있다. 에러 처리를 하면서 겪었던 어려움이 머리 속에 정리가 잘 안돼있다고 느껴서 글을 작성하게 되었다. 같은 환경으로 에러 처리를 구현하려고 한다면 글이 참고가 될 것이다…

    전략패턴과 커맨드패턴 cover image
    #design-pattern

    전략패턴과 커맨드패턴

    인터페이스를 구현하여 사용하는 두 가지 패턴인 전략 패턴과 커맨드 패턴. 자주 사용하지만, 이 둘의 차이점은 무엇일까? 알쏭달쏭한 전략 패턴과 커맨드 패턴의 차이점을 알아보는 전략 패턴과 커맨드 패턴 글입니다. 학습 로그 정리 중에 만난 복병 지난 …

    TCP/IP cover image
    #tcp

    TCP/IP

    TCP/IP TCP TCP는 Transmission Control Protocol의 약어로서 인터넷상의 데이터를 주고받는 과정을 제어하는 통신 표준을 의미합니다. 이 프로토콜은 데이터를 교환하는 기기 간 데이터의 무결성(정확성)과 전달의 신뢰성을 보…

    Java 8 에서 왜 함수형 프로그래밍이 도입되었을까? cover image
    #java

    Java 8 에서 왜 함수형 프로그래밍이 도입되었을까?

    우선 당신에게 질문을 던져본다. 객체지향 프로그래밍과 함수형 프로그래밍은 상호 배제 관계에 있다고 생각하는가? 객체지향과 함수형 프로그래밍 Java 혹은 다른 객체지향 프로그래밍 언어로 처음 프로그래밍하던 시절이 생각나는가? 그 당시에는 객체지향 이…

    http와 https에 대해 알아보자 cover image
    #http

    http와 https에 대해 알아보자

    최근 프로젝트를 EC2로 배포를 하였는데, 가 적용되어있지 않아서, ‘주의 요함’, ‘이 사이트는 보안 연결(HTTPS)이 사용되지 않았습니다.’ 라는 문구를 볼 수 있었다. 그래서 는 와 어떤 차이가 있고, 어떻게 보안 문제를 해결하였는지 궁금해졌…

    우테코 프로젝트에서 Github Actions를 이용한 배포 자동화 cover image
    #Github Actions

    우테코 프로젝트에서 Github Actions를 이용한 배포 자동화

    팀 프로젝트 백중원에서 프론트앤드 배포 인프라로 AWS의 S3와 CloudFront를 사용하고 있다. 하지만 배포 과정에서 자동화가 적용되지 않은 상태라, 실제 서비스에 사용되는 브랜치나 브랜치가 최신화될 때 매번 수동으로 S3에 객체를 업로드하…

    HTTP/2 프로토콜 NGINX 적용하기 cover image
    #http

    HTTP/2 프로토콜 NGINX 적용하기

    HTTP/2 프로토콜의 특징과 NGINX에서의 간단한 설정 방법에 대해 알아본다. HTTP/2를 알아보기 전에, 그 이전 프로토콜인 HTTP/1.x를 먼저 알아보자. 대부분의 서버(NGINX, apache, SpringBoot …등)는 기본설정으로 …

    메시지 큐에 대해 알아보자! cover image
    #message-queue

    메시지 큐에 대해 알아보자!

    메시지 큐란 메시지 큐(Message Queue)는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중에 하나로, 메시지 지향 미들웨어(Message Oriented Middleware:MOM)를 구현한 시스템을 의미한다. 메시지…

    DB Index 입문 cover image
    #database

    DB Index 입문

    1. Index란? Index는 DB 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. Index는 테이블 내 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. 고속의 검색 동작뿐만 아니라 레코드 접근과 관련 …

    Replication과 Clustering cover image
    #database

    Replication과 Clustering

    프로젝트를 진행하면서 서버를 늘리게 되었다. 서비스 이용자가 당장 많아서 적용한 것은 아니었지만 미래에 많은 사용자가 이용하기를 바라는 마음과 그때 허겁지겁 대비하는 것보다는 미리 대비하자는 차원에서 적용하였다. 하지만 서버는 늘렸는데 과연 효율적으…

    🧶 Java 에서 스레드 풀(Thread Pool) 을 사용해 보자 cover image
    #java

    🧶 Java 에서 스레드 풀(Thread Pool) 을 사용해 보자

    프로세스 내에서 스레드의 생성 및 수거가 빈번하게 발생한다면 메모리 할당에 소모되는 비용이 많이 들지 않을까? 이에 대한 해답으로 스레드 풀에 대해 알아보고 Java 에서 어떻게 사용하면 되는지 알아보자. 스레드 풀(Thread Pool) 스레드 제…

    리눅스 배포판이란? cover image
    #linux

    리눅스 배포판이란?

    Ubuntu , Fedora , Manjaro , Centos … AWS 인스턴스 설정에서 만나는, 운영체제에 대한 것들은 도대체 무엇일까? 이번 글은 배포 시에 마주치는 리눅스 배포판들과 리눅스의 특징들에 대해 다룬 글, “리눅스 배포판이란?” 입…

    비동기 처리 시 race condition 고려하기 cover image
    #race-condition

    비동기 처리 시 race condition 고려하기

    비동기 처리 시 race condition 고려하기 프로그래밍을 할 때 비동기 처리는 여간 까다로운 게 아닙니다. 저마다의 어려움이 있겠지만, 대표적으로 그 이유를 ‘낮은 예측성’에 들 수 있는데요. 아무리 잘 작성된 비동기 코드라 할 지라도, 동기…

    CSR 앱에서 SSR + CSR 환경으로 이주하기 cover image
    #csr

    CSR 앱에서 SSR + CSR 환경으로 이주하기

    ❗ CSR에 SSR을 적용하는데 어려움을 겪는 분들을 위해 작성했습니다. 혹시 틀린 부분이 있다면 말씀해주세요! ❗ SSR과 refresh token에 대한 사전 지식이 있으면 글을 이해하기 조금 더 편합니다. ❗ 웹서버와 WAS가 무엇인지 궁금하다…

    멀티 모듈 적용하기 with Gradle cover image
    #gradle

    멀티 모듈 적용하기 with Gradle

    이번 글에서는 프로젝트를 구성하는 데 있어 멀티 모듈 활용했을 때의 장점과 간단한 설정 방법을 알아본다. 멀티 모듈의 개념을 처음 접하는 사람들이 읽어보기를 추천한다. 멀티 모듈이란? 오라클 자바 문서에서는, 모듈을 패키지의 한 단계 위의 집합체이며…

    웹 소켓에 대해 알아보자! - 실전 편 cover image
    #websocket

    웹 소켓에 대해 알아보자! - 실전 편

    웹 소켓에 대해 알아보자! - 실전 편 이번 글에서는 저번에 작성했던 웹 소켓 이론 편에 이어서, 스프링 환경에서 웹 소켓을 사용하는 법에 대해 다루려고 한다. STOMP 구현하기에 앞서, 우리는 새로운 프로토콜을 도입할 것이다. 바로 STOMP이다…

    관계형 DB에서 계층적인 데이터 관리하기 cover image
    #database

    관계형 DB에서 계층적인 데이터 관리하기

    1. 계층형 댓글 구현 image 우아한테크코스 레벨 3 팀 프로젝트에서 SNS 성격의 웹 어플리케이션을 개발하게 되었습니다. SNS 기능 요구사항 중 특정 댓글에 대한 대댓글 작성이라는 다소 까다로운 요구사항이 존재했는데요. 관계형 DB에서 계층적…

    📊 로그 시각화는 왜 중요할까? cover image
    #log

    📊 로그 시각화는 왜 중요할까?

    로깅을 통해 개발자는 개발 과정 혹은 개발 후에 발생할 수 있는 예상치 못한 애플리케이션의 문제를 진단할 수 있고, 다양한 정보를 수집할 수 있다. 단순히 로그를 확인한다는 것은 추상적인 행위로 보인다. 기록을 남기는 것이 아닌 구체적으로 어떤 정보…

    Redis 알아보기 cover image
    #Redis

    Redis 알아보기

    이글은 Redis에 대해 들어봤거나 어렴풋이 알고 있는 독자들을 대상으로 작성하였습니다. 우테코 레벨 3 에서 프로젝트를 진행하면서 Redis를 적용해보게 되었다. Redis라는 단어를 많이 들어봤고 어렴풋이 캐싱을 통하여 속도를 빠르게 해준다는 것…

    JVM에 관하여 - Part 4, Garbage Collection 기초 cover image
    #jvm

    JVM에 관하여 - Part 4, Garbage Collection 기초

    Java 로 작성된 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 4편, JVM 의 구성요소 중 GC 에 관한 글입니다. 이번 글에서는 JVM 의 GC 에 대한 기초 지식에 대해서 알아봅시다. JVM 에서의 메모리 관리 지…

    정적 웹 사이트에 대해 알아보자. cover image
    #static-web-page

    정적 웹 사이트에 대해 알아보자.

    최근 S3를 통한 배포를 실습해보면서, 을 하였다. 그러면서 이라는 단어에 의문이 들었다. *호스팅 - 서버 컴퓨터의 전체 또는 일부를 임대해주는 서비스 대개 정적 웹 사이트는 ‘모든 상황에서 모든 사용자에게 동일한 정보를 표시하는 웹사이트’, 동적…

    웹팩 Asset Modules cover image
    #webpack

    웹팩 Asset Modules

    이 글은 webpack에 대한 기본적인 이해가 필요한 글입니다. 웹 애플리케이션을 제작하면서 HTML, CSS, JS와 더불어 아이콘, 사진, 비디오 등 다양한 Asset을 추가하게 된다. Asset Modules은 로더를 추가하지 않아도 이러한 a…

    이벤트 루프, 넌 누구냐 cover image
    #event-loop

    이벤트 루프, 넌 누구냐

    최근 requestAnimationFrame(이하 rAF)과 setTimeout을 공부하면서 브라우저의 싱글 스레드 동작이 정확히 어떻게 이루어지는지 잘 모른다는 생각이 들었다. 이번 기회에 이벤트 루프의 동작을 공부하고 추가로 rAF와 setTim…

    Web Event 다루기 cover image
    #event

    Web Event 다루기

    Web Event 다루기 웹 개발에서 프론트엔드 영역이 이토록 발전할 수 있었던 가장 주된 이유는 웹의 특성이 단순한 ‘페이지’에서 ‘애플리케이션’으로 진화했다는 사실일 겁니다. 그리고 이 말은 곧, 좋은 웹의 기준을 판단할 때 사용자의 행동에 따라…

    다양한 이미지 타입 cover image
    #jpg

    다양한 이미지 타입

    누구나 쉽게 읽을 수 있는 글입니다. 0. Intro 어느 조사에 따르면 이미지 파일은 6.3퍼센트만을 제외하고 모든 웹 사이트에서 사용된다. 그만큼 이미지는 사용자에게 친숙하고 당연히 있어야 할 것처럼 여겨진다. 이런 이미지 파일은 그 목적에 따라…

    JPA CascadeType.REMOVE vs orphanRemoval = true cover image
    #jpa

    JPA CascadeType.REMOVE vs orphanRemoval = true

    JPA를 공부하다 보면 바로 이해하기 쉽지 않은 개념들을 몇 개 마주친다. 필자는 연관관계 매핑, 영속성 전이, 고아 객체 등이 특히 어려웠다. 이때 와 가 유독 헷갈렸는데, 직접 학습 테스트를 작성하며 이해했다. 이번 글에서는 영속성 전이(REMO…

    Pageable을 이용한 Pagination을 처리하는 다양한 방법 cover image
    #spring

    Pageable을 이용한 Pagination을 처리하는 다양한 방법

    Spring Data JPA에서 Pageable 를 활용한 Pagination 의 개념과 방법을 알아본다. Pageable을 활용한 Pagination이 무엇인가? 많은 게시판은 모든 글을 한 번에 보여주지 않고 페이지를 나눠 쪽수별로 제공한다. 정…

    react에서의 에러 처리 cover image
    #react

    react에서의 에러 처리

    🔥 아직 고민할 점이 많은 문제입니다. 다양한 의견 남겨주세요 🔥 에러 처리에 대해서 개인적인 생각들을 담았습니다. 🚫 에러, 어떻게 처리해야하나 이전부터 프론트 개발을 하면서 계속 고민했던 부분이다. 팀 프로젝트를 할 때 명확한 기준없이 에러 처리…

    CI/CD가 뭔가요? - 이론편 cover image
    #infra

    CI/CD가 뭔가요? - 이론편

    우리는 여태까지 어떻게 하면 더 좋은 코드를 만들어낼 수 있을지에 대해서 고민해왔다. 하지만 궁극적으로 우리가 하고 싶은 것은 사용자에게 우리가 멋드러지게 만든 코드를 결과물로 만들어 보여주는 것이다. 어떻게 하면 사용자에게 우리의 코드를 보여줄 수…

    docker 이해하기 cover image
    #docker

    docker 이해하기

    이 글은 도커를 처음 사용해보거나 아직 도커에 익숙하지 않은 독자들을 대상으로 작성하였습니다. 도커란? 도커는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 컨…

    웹 소켓에 대해 알아보자! - 이론 편 cover image
    #websocket

    웹 소켓에 대해 알아보자! - 이론 편

    웹 소켓에 대해 알아보자! - 이론 편 실시간 알림, 실시간 채팅 등 실시간이라는 키워드가 들어가는 기능들을 위해서는 대부분 웹 소켓 기술이 필요하다. 이 글에서는 다음과 같은 주제를 다룬다. 웹 소켓이 무엇인지 웹 소켓의 탄생 배경 웹 소켓의 동작…

    프론트엔드 테스트 자동화 해보기. cover image
    #test-automation

    프론트엔드 테스트 자동화 해보기.

    우테코는 프로젝트 중 여름이 막바지에 접어드는 요즘, 우아한테크코스에서는 크루들이 모여 진행하는 프로젝트 기간인 레벨3도 끝나가고 있습니다. 코스는 프로젝트만 하라고 마냥 내버려두는게 아니라 일정기간마다 프로젝트에 적용해야 되는 과제를 내줍니다. …

    PWA에 대해 알아보자 cover image
    #PWA

    PWA에 대해 알아보자

    이번에 프로젝트로 웹 애플리케이션를 개발하면서 라는 개념에 대해 접하게 되었다. 웹 애플리케이션, 프론트엔드를 공부하는 입장에서 처음 접하는 용어에 대한 호기심이 생겼고, 이번 시간을 통해 에 대해 함께 알아보려고 한다. 모바일 앱 에 대해 알…

    JVM에 관하여 - Part 3, Run-Time Data Area cover image
    #jvm

    JVM에 관하여 - Part 3, Run-Time Data Area

    Java 로 작성된 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 3편, JVM 의 구성요소 중 Run-Time Data Area 에 관한 글입니다. 이번 글에서는 JVM 의 메모리 영역에서는 어떤 일이 일어나는지에 대해서…

    Spring Boot에 QueryDSL을 사용해보자 cover image
    #jpa

    Spring Boot에 QueryDSL을 사용해보자

    1. QueryDSL PostRepository.java Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 됩니다. 간단한…

    Logback 으로 쉽고 편리하게 로그 관리를 해볼까요? ⚙️ cover image
    #log

    Logback 으로 쉽고 편리하게 로그 관리를 해볼까요? ⚙️

    Spring Boot 를 통해 프로젝트를 개발할 때, 로깅을 적용하려는 초심자분들을 위한 글입니다. 로깅을 하는 이유? 로깅이란 시스템이 동작할 때 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미한다. 로깅을 통해 개발자는 개발 …

    웹 애플리케이션의 성능 고려하기 cover image
    #최적화

    웹 애플리케이션의 성능 고려하기

    웹 애플리케이션의 성능 고려하기 성능이 좋다는 건 웹 애플리케이션(이하 웹 앱) 구현에 어느 정도 익숙해지는 단계가 되면, 언젠가는 맞닥뜨려야 할 산이 있다. 바로 성능이다. 개발자의 관점에서 성능이 당최 무엇을 의미하는지는 몰라도, 누구든 성능이 …

    Email 보내기에 비동기, 이벤트를 곁들인. cover image
    #email

    Email 보내기에 비동기, 이벤트를 곁들인.

    서비스를 운영하는 데 Email 전송 기능을 도입하는 경우가 많다. 이메일 기능에 비동기와 이벤트 발행 방식을 도입하게 된 이유와 방법에 관해서 설명해 보고자 한다. Email 보내기 Spring에서 제공하는 , 인터페이스를 이용하면 쉽게 메일 서…

    git submodule로 중요한 정보 관리하기 cover image
    #git

    git submodule로 중요한 정보 관리하기

    git submodule은 메인(부모) 레포지토리에 하위(자식) 레포지토리를 두고 관리하기 위한 도구이다. 하나의 프로젝트에서 다른 프로젝트를 함께 사용해야 하는 경우 주로 활용한다. 필자는 이번에 이를 프로젝트 비밀 정보를 숨기기 위한 용도로 이용…

    JPA와 연관관계 cover image
    #spring

    JPA와 연관관계

    JPA란? RDBMS를 사용하던 우리는 java를 이용한 객체지향 프로그래밍을 통해 객체 간 관계가 더욱 복잡해질수록 패러다임 불일치의 문제를 마주하게 된다. 상속과 참조가 쉬워 객체 간 관계를 쉽게 지정할 수 있는 것과 다르게 RDBMS의 테이블에…

    리눅스 컨테이너에 대해 알아보자 cover image
    #lxc

    리눅스 컨테이너에 대해 알아보자

    2014년, Google이 Docker를 채택해 개발자들의 주목을 끌었습니다. 2021년 현재, 이제 Docker의 존재에 대해서 모르는 사람들이 거의 없을 정도로 보편적인 기술이 되었습니다. Docker는 태초에 LXC라는 컨테이너 기술을 기반으로…

    웹 서버와 NginX cover image
    #web-server

    웹 서버와 NginX

    이번에 프로젝트를 진행하면서 처음으로 웹 서버를 직접 구축해보았다. 웹 서버를 구축하면서 를 사용하게 되었는데, 웹 서버를 구축하는데 필요한 설정들을 편리하게 추가 할 수 있었다. 하지만 웹 서버를 구축하면서 한 번 사용해본 게 전부이기 때문에, …

    Cypress를 활용한 React 테스팅 cover image
    #react

    Cypress를 활용한 React 테스팅

    cypress에 대한 기본적인 이해가 필요한 글입니다. 0.Intro 바닐라 자바스크립트에서 cypress를 통해 테스트를 진행한 경험은 있지만, react에서는 아직 적용해보지 못했다. 이번에 프로젝트를 진행하면서 테스팅 도구를 고민하다가 cypr…

    JVM에 관하여 - Part 2, ClassLoader cover image
    #jvm

    JVM에 관하여 - Part 2, ClassLoader

    Java 로 작성한 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 2편, JVM 의 구성 요소 중 ClassLoader 에 관한 글입니다. 이번 글에서는 ClassLoader 가 어떤 역할을 하는지에 대해서 알아봅니다. 클…

    JPA Pagination, 그리고 N + 1 문제 cover image
    #spring

    JPA Pagination, 그리고 N + 1 문제

    1. Pagination 게시판 기능을 제공하는 웹 어플리케이션에 접속하여 게시물 목록을 요청하는 경우를 상상해봅시다. DB에 저장되어 있는 게시물은 수백 만개에 육박할 수도 있습니다. 모든 게시물 목록을 조회해 화면에 렌더링하는 경우, 클라이언트가…

    RestTemplate과 WebClient cover image
    #spring

    RestTemplate과 WebClient

    이 글은 자바에서 HTTP 요청을 써봤거나 써보려고 하는 독자를 대상을 작성하였습니다. 스프링 어플리케이션에서 HTTP 요청할 때 사용하는 방법으로 RestTemplate과 WebClient가 있다. 스프링 5.0 이전까지는 클라이언트에서 HTTP …

    사용자 경험 개선 2편 - react concurrent mode cover image
    #react

    사용자 경험 개선 2편 - react concurrent mode

    ❗ react suspense에 대한 이해가 필요한 글입니다. 사용자 경험 개선 1편을 참고해주세요. 👀 concurrent mode란 무엇인가 자바스크립트가 싱글 스레드 언어라는 것을 들어본 적이 있을 것이다. 이는 자바스크립트가 하나의 작업을 수…

    클로져와 가까워지기 cover image
    #closure

    클로져와 가까워지기

    0. 인트로 클로져를 MDN에서 검색해보면 클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다. 라는 문장이 나옵니다. 무슨 뜻인지 단번에 받아들이기 어렵지 않나요? 솔직히 프로그래밍을 하면서 클로져를 활용해볼 일이 그렇게 자주 있지는 않은 것 같…

    vim을 대하는 자세 cover image
    #vim

    vim을 대하는 자세

    리눅스 텍스트 편집기 중 하나인 vim. 많이들 vim을 어렵고 외워야만 하는 것으로 생각한다. 이를 보다 쉽게 사용할 수 있게 해주는 vim을 대하는 자세, ‘대화’의 방법을 소개하고자 한다. Intro 글의 시작에 앞서, 글쓴이는 vim을 자유자…

    DispatcherServlet - Part 2 cover image
    #spring

    DispatcherServlet - Part 2

    지난 1편에서는 DispatcherServlet 정의, 설정 방법, 동작 흐름에 대해 알아봤다. 이번 2편에서는 DispatcherServlet의 동작 원리를 코드와 함께 살펴보자. 아직 1편을 읽지 않았다면, 아래 글을 먼저 읽고 오자. Dispa…

    git 브랜치 전략에 대해서 cover image
    #git

    git 브랜치 전략에 대해서

    Git 우리는 개발을 진행하면서 우리가 구현한 소스코드를 git이라는 버전 관리 시스템을 통해 관리한다. git을 사용하지 않았더라면 협업을 진행하면서 메일이나 USB로 소스코드를 주고받아야 했을 것이다. git을 사용함으로써 우리는 시시각각 코드를…

    리액트 컴포넌트 npm publish cover image
    #react

    리액트 컴포넌트 npm publish

    리액트를 사용할 수 있는 독자를 대상으로 작성한 글입니다. 0. Intro 프로젝트를 진행하면서 이미 친숙한 리액트를 포함하여 다양한 라이브러리들을 npm 또는 yarn으로 설치해서 이용합니다. 그렇다면 이런 라이브러리들은 어떻게 만들어지는 걸까요.…

    JVM에 관하여 - Part 1, JVM, JRE, JDK cover image
    #jvm

    JVM에 관하여 - Part 1, JVM, JRE, JDK

    자바로 작성된 코드는 어떻게 돌아가는 걸까? 해당 물음에 답을 찾기 위한 JVM 시리즈 1편, JVM, JRE, JDK에 관한 글입니다. 이번 글에서는 배포 환경 혹은 개발 환경을 세팅하면서 설치를 하였던 JRE와 JDK가 무엇인지에 대해서 다루게 …

    Database Transaction cover image
    #database

    Database Transaction

    트랜잭션 이란? SQL을 사용하여 INSERT나 UPDATE 명령을 사용할 때 COMMIT을 해주어야 실제 데이터베이스에 반영이 된다. 트랜잭션에 대하여 아직 깊게 공부하지 않은 사람이라면 ‘나는 COMMIT 한 적이 없는데 데이터베이스에 반영이 되…

    사용자 경험 개선 1편 - react suspense cover image
    #suspense

    사용자 경험 개선 1편 - react suspense

    📜 읽기 전에… 🎈 본문에 등장하는 문제에 대한 예시는 suspense를 사용하지 않고도 해결할 수 있습니다. 하지만 앱이 커지고 복잡해짐에 따라 각 문제를 어떻게 으로 봐주시길 바랍니다. 🎈 2021.07.11 기준 시험적인 기능입니다. 현재 정식…

    OAuth 개념 및 동작 방식 이해하기 cover image
    #oauth

    OAuth 개념 및 동작 방식 이해하기

    1. OAuth란? image 웹 서핑을 하다 보면 Google과 Facebook 및 Twitter 등의 외부 소셜 계정을 기반으로 간편히 회원가입 및 로그인할 수 있는 웹 어플리케이션을 쉽게 찾아볼 수 있습니다. 클릭 한 번으로 간편하게 로그인할 …

    웹팩 이해하기 - 2 cover image
    #webpack

    웹팩 이해하기 - 2

    지난 글에서는 프론트엔드 개발 환경 설정을 위해 가장 많이 사용되는 웹팩의 정의와 필요성에 대해 알아보았다. (*웹팩 이해하기 - 1 ) 내용을 간략하게 정리하자면 웹팩은 애플리케이션에 필요한 모든 파일(모듈)을 병합하고 압축해서 하나의 결과물(번들…

    .git 내부 구조 파헤치기 cover image
    #git

    .git 내부 구조 파헤치기

    개발을 함에 있어 필수 요소가 된 . 개발 과정에서의 수많은 커밋과 브랜치, 관리되는 파일의 정보들이 모두 .git 안에서 관리되는데, 그 내부를 파헤쳐 본다. 이 글은 git을 어느 정도 사용해보고 읽는 것을 추천한다. .git 내부 구조 .gi…

    Babel cover image
    #babel

    Babel

    바벨을 사용하는 게 익숙하지 않은 독자를 대상으로 작성한 글입니다. 0. Intro 보통 프로젝트를 시작하기 위해 초기 설정을 하며 바벨을 처음 만나게 됩니다. 필요하다고 하니깐 사용하기는 하는데, 초기 설정 이후 우리는 바벨을 잊곤 합니다. 어렴풋…

    Message Oriented Middleware cover image
    #message

    Message Oriented Middleware

    프로젝트를 진행하면서, 서버와 서버 사이에 메시지를 통해 비동기적으로 전달하는 방법이 필요했다. 관련된 개념인 Message Oriented Middleware(메시지 기반 미들웨어)에 관해 알아보고, 메시지 전달의 두 가지 방식인 메시지 큐와 Pu…

    웹팩 이해하기 - 1 cover image
    #webpack

    웹팩 이해하기 - 1

    그 동안 React.js로 개발을 진행할 때는 항상 CRA(create-react-app)*를 사용하여 개발 환경을 설정하였다. 그래서 CRA를 사용하면 바로 개발을 시작할 수 있었기 때문에 개발 환경에 대한 고민을 깊게 해보지 않았다. 그런데 이번…

    ConstraintValidator를 이용한 커스텀 어노테이션 예외 처리 cover image
    #validation

    ConstraintValidator를 이용한 커스텀 어노테이션 예외 처리

    를 이용한 커스텀 어노테이션 예외 처리 커스텀 어노테이션이란? 사용자 입력의 유효성을 보다 세부적으로 입력을 검증해야 할 때, 커스텀 어노테이션을 이용하여 예외 검증 로직을 생성할 수 있다. 이 때, hibernate에서 제공하는 Constraint…

    AOP 입문자를 위한 개념 이해하기 cover image
    #spring

    AOP 입문자를 위한 개념 이해하기

    이 글은 AOP 개념이 생소한 입문자들을 위한 포스팅입니다. 1. OOP의 한계 image 객체지향 프로그래밍은 어플리케이션을 설계할 때 책임과 관심사에 따라 클래스를 분리합니다. 클래스가 단일 책임을 가지도록 분리함으로써 각 모듈의 응집도는 높아지…

    bean wiring cover image
    #spring

    bean wiring

    스프링을 처음 공부하는 사람을 대상으로 작성한 글입니다. 빈 와이어링(wiring) 이란? 스프링을 사용하는 애플리케이션에서 각 객체가 필요한 다른 객체를 직접 찾거나 생성할 필요가 없다. 컨테이너가 협업할 객체에 대한 정보를 주기 때문이다. 애플리…

    DispatcherServlet - Part 1 cover image
    #spring

    DispatcherServlet - Part 1

    DispatcherServlet에 대해 1, 2편으로 나누어 설명한다. 1편에서는 DispatcherServlet이 무엇인지 알아보고, 이것을 설정하는 방법과 동작 흐름을 살펴본다. DispatcherServlet? DispatcherServlet은…

    Optional 과 null 에 대해 ⌥␀ cover image
    #optional

    Optional 과 null 에 대해 ⌥␀

    런타임에서 발생하는 NullPointException 방어를 위해 만들어둔 로직체크는 코드의 가독성과 유지 보수성이 떨어진다. 어떻게 null 을 다루면 좋을 지에 대한 해결책을 함수형 언어에서 찾았다. 함수형 언어는 존재하지 않을 수도 있는 값에 …

    Typescript Minimal-Start - 2. 좀 더 나아가기 cover image
    #typescript

    Typescript Minimal-Start - 2. 좀 더 나아가기

    0.Intro 1편에서 타입스크립트의 기본적인 문법에 대해 알아보았습니다. 이번 포스팅에서는 타입스크립트에서 조금 더 심화된 내용을 다뤄봅니다. 시리즈의 컨셉을 따라 개념적 맥락을 파악할 수 있는 수준에서 최소한의 내용을 다룹니다. Table of …

    @RequestMapping cover image
    #spring

    @RequestMapping

    우리는 client에서 오는 요청을 처리하기 위한 api url을 매핑할 때 Spring의 이라는 어노테이션을 사용한다. Spring은 사용자의 편리를 위해 RequestMapping을 http에서 지원하는 4가지 method인 , , , 과 추가적…

    Prototype, 그리고 Class cover image
    #prototype

    Prototype, 그리고 Class

    Prototype JS에서 프로토타입이란, 객체의 특성을 다른 객체로 상속하는 것을 가능하게 하는 메커니즘이다. (엄밀히 말하자면 ‘상속’이라는 단어는 적절치 않을 수 있다. 그 이유는 밑에서 다시 다루어 보겠지만, 일단은 일관된 이해를 돕기 위해 …

    단위 테스트 vs 통합 테스트 vs 인수 테스트 cover image
    #test

    단위 테스트 vs 통합 테스트 vs 인수 테스트

    소프트웨어 테스트에는 여러 유형들이 있다. 각 테스트는 목적, 방법 등에 따라 차이점을 가진다. 이번 글에서는 그 중 단위 테스트, 통합 테스트, 인수 테스트에 대해 개념을 정리하려 한다. 단위 테스트(Unit Test) 단위 테스트는 응용 프로그램…

    Apache HTTP Server? Apache Tomcat? 서버 바로 알기 cover image
    #spring-boot

    Apache HTTP Server? Apache Tomcat? 서버 바로 알기

    Spring Boot 을 공부하면서 어떻게 구성이 되어있는지도 공부를 하게 되었습니다. 전체적인 흐름은 Client 로부터 받은 HTTP 요청을 알맞게 처리하여, Controller 로 넘겨주게 됩니다. 이때, 해당 기능을 실행하는 WAS(Web A…

    Iteration Protocol cover image
    #iteration-protocols

    Iteration Protocol

    Iteration Protocol ES6가 출현하면서 여러 문법뿐만 아니라 Iteration Protocol이라는 규칙이 추가되었다. 이것은 JS 자체의 독자적인 특징이라기보다는 여러 언어에서 반복 동작을 수행하기 위해 정의하는 방법에 가깝다. 이번…

    Servlet 과 ServletContainer cover image
    #http

    Servlet 과 ServletContainer

    Servlet 서블릿(Servlet)은 클라이언트 요청을 처리하고, 그 결과를 반환하는 웹 프로그래밍 기술이다. 클라이언트가 요청을 하면 그에 대한 결과를 다시 전송해주는 역할을 자바 프로그램이 하는 것이다. 이전의 웹 프로그램들은 클라이언트의 요청…

    StreamAPI 나도 한 번 써보자! cover image
    #stream

    StreamAPI 나도 한 번 써보자!

    Java 의 Stream API 사용 방법을 알아보자. 우아한테크코스 프리코스 과정에서 Stream API 를 사용해서 코드를 맛깔나게 구현하는 분들을 보면 괜스레 해야 할 것 같고, 유용해 보여서 흥미가 생긴다. 처음 보는 Stream API 를 …

    SWR, 서버 데이터를 앱 데이터처럼 관리해보자 cover image
    #refactoring

    SWR, 서버 데이터를 앱 데이터처럼 관리해보자

    프론트엔드는 웹과 사용자가 맞닿아 있는 부분을 개발하는 영역이다. 따라서 프론트 개발자에게 라는 문제는 정말 중요하다고 볼 수 있다. 그런데 서버의 데이터를 보여주기 전에 관리부터 해야 할 텐데 다들 어떻게 관리해왔을까? 서버 데이터를 앱에서 관리하…

    Typescript Minimal-Start - 1.기본 문법 cover image
    #typescript

    Typescript Minimal-Start - 1.기본 문법

    0.Intro 아직 자바스크립트도 잘 못하는데.. 타입스크립트를 자신의 코드에 도입하는데 주저하는 분들이 있습니다. 각자의 이유가 있겠지만 러닝커브에 대한 막연한 두려움이 가장 보편적일 것입니다. 타입스크립트는 자바스크립트를 잘하는 사람들이 사용하는…

    인증 방식 : Cookie & Session vs JWT cover image
    #jwt

    인증 방식 : Cookie & Session vs JWT

    1. HTTP 특성 HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜입니다. 클라이언트가 서버에게 요청을 보내면 서버는 응답을 보냄으로써, 데이터를 교환합니다. HTTP는 비연결성 및 무상태성 이라는 특징을 가…

    HTML <form> 잘 쓰는 법. cover image
    #html

    HTML <form> 잘 쓰는 법.

    이번 글에서는 “HTML 잘 쓰는 법”에 대해 공유하려고한다. 사실 제목은 거창하게 지었지만, 개인적으로 우아한테크코스에 참여하기 전에 알았으면 좋았을 것 같은 에 대한 내용을 정리해 보았다. 누군가에게는 당연한 내용일 수 있지만, 나처럼 에 …

    Spring ArgumentResolver와 Interceptor cover image
    #spring

    Spring ArgumentResolver와 Interceptor

    이번 글에서는 ArgumentResolver와 Interceptor를 사용할 때 spring이 요청을 처리하는 순서를 알아보고자 한다. 그 전에 ArgumentResolver는 무엇인지, Interceptor는 무엇인지 알아보도록 하자. Spring…

    Spring Boot 슬라이스 테스트 cover image
    #test

    Spring Boot 슬라이스 테스트

    Spring Boot 슬라이스 테스트 슬라이스 테스트란? 레이어를 독립적으로 테스트하기 위해 라이브러리를 활용했는데, 코드 리뷰를 받으면서 슬라이스 테스트라는 용어를 알게 되었다. 말 그대로 레이어별로 잘라서, 레이어를 하나의 단위로 보는 단위 테…

    java에서 객체를 생성하는 다양한 방법 cover image
    #java

    java에서 객체를 생성하는 다양한 방법

    이 글은 java 초심자들에게 추천합니다. 우리가 사용하는 java라는 언어는 객체지향 프로그래밍 언어입니다. 객체지향 프로그래밍이란 수행하고자 하는 프로그래밍 로직을 상태와 행위로 이루어진 객체들의 모임으로 수행해나가는 것입니다. 자연스레 우리는 …

    DTO vs VO vs Entity cover image
    #spring

    DTO vs VO vs Entity

    DTO와 VO는 분명히 다른 개념이다. 그런데, 같은 개념으로 생각해서 사용하는 경우가 많다. 왜일까? ⌜Core J2EE Patterns: Best Practices and Design Strategies⌟ 책의 초판에서는 데이터 전송용 객체를 로…

    React ref 톺아보기 cover image
    #react

    React ref 톺아보기

    0. Intro React로 웹프론트엔드 개발을 하다보면 React만으로는 DOM을 조작하기 어려울 때가 있습니다. 가장 흔하게는 어떤 엘리먼트를 focus 해야 할 때 말이죠. React의 ref는 무엇이고, ref를 사용하는 이유에 대해 이야기해…

    리액트로 생각하기 cover image
    #react

    리액트로 생각하기

    리액트로 생각하기 제목이 약간은 어색해 보인다. ‘리액트에 대해서 생각하기’가 더 자연스러울 것 같은데 리액트로 생각하자는 말은 어떤 의미일까? 리액트를 공부하며 그 방대한 생태계에서 끊임없이 헤매는 중이지만, 최근에 그나마 알게 된 사실이 있다면 …

    프론트엔드에서의 Inversion of Control cover image
    #refactoring

    프론트엔드에서의 Inversion of Control

    🎁 Inversion of Control 이란? , 제어 역전이란 무엇일까? 가장 간단히 설명하자면 용어 그대로 코드의 로직이 일반적인 제어 흐름이 아니라 역전된 것을 의미한다. 하지만 처음 IoC를 듣게 되면 은 무엇인지, 그리고 그 흐름이 어떻게…

    @RequestBody vs @ModelAttribute cover image
    #spring

    @RequestBody vs @ModelAttribute

    1. @RequestBody와 @ModelAttribute Controller.java @RequestBody와 @ModelAttribute는 클라이언트 측에서 보낸 데이터를 Java 코드에서 사용할 수 있는 오브젝트로 만들어주는 공통점이 있습니다.…

    ExceptionHandler 와 ControllerAdvice cover image
    #java

    ExceptionHandler 와 ControllerAdvice

    @ExceptionHandler @ExceptionHandler 는 @Controller , @RestController 가 적용된 Bean 에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능이다. @ExceptionHandler 에 설정…

    ResponseEntity - Spring Boot에서 Response를 만들자 cover image
    #spring-boot

    ResponseEntity - Spring Boot에서 Response를 만들자

    웹 서비스에서는 많은 정보를 송수신하게 됩니다. 각각의 다른 웹 서비스들이 대화하려면, 서로 정해진 약속에 맞게 데이터를 가공해서 보내야합니다. 보내는 요청 및 데이터의 형식을 우리는 HTTP(HyperText Transport Protocol) 이…

    Java 의 Stack 대신 Deque cover image
    #java

    Java 의 Stack 대신 Deque

    🤹‍♀️ 자바에서 자료구조 Stack 을 대신해서 사용하는 Deque 에 대해서 알아보자. 이 글은 기능을 사용하는 방식이 아닌 ‘왜 Stack 대신 Deque 를 사용해야 하는가?‘에 대해서 설명한다. Stack 후입선출(Last In First Out…

    DOM(Document Object Model) Element를 다뤄보자. cover image
    #dom-element

    DOM(Document Object Model) Element를 다뤄보자.

    웹 개발을 할 때 웹 콘텐츠의 내용과 구조를 변경하기 위해서 자연스럽게 DOM element 를 다루게 된다. 이때 가장 편하고 쉬운 방법은 innerHTML을 사용하는 것이었다. 하지만 지난 글에서는 XSS*에 대한 내용과 함께 innerHTML을…

    의존관계 주입(Dependency Injection) 쉽게 이해하기 cover image
    #java

    의존관계 주입(Dependency Injection) 쉽게 이해하기

    이번 글에서는 DI(의존성 주입, 의존관계 주입)의 개념을 설명한다. DI란 용어가 주는 위압감과 부담감 때문에 이해를 미뤄뒀거나, 처음 접하는 분들이 쉽게 이해할 수 있도록 쉽게 설명하고자 한다. DI 란 무엇인가 DI는 Dependency Inj…

    리액트의 Key를 알아보자 cover image
    #javascript

    리액트의 Key를 알아보자

    이번 글에서는 리액트에서 key를 사용하는 이유와 올바른 사용법에 대해서 알아보고자 한다. key를 사용하는 이유 간단한 이해를 위해서 다음과 같은 배열이 있다고 하자. 그리고 위 배열을 다음과 같이 렌더링 한다고 가정해보자. 이후 a, b, z, …

    BigInteger_BigDecimal cover image
    #test

    BigInteger_BigDecimal

    BigInteger, BigDecimal? , 은 java.math 패키지 안에 있는 숫자를 다루는 클래스이다. 두 클래스 모두 숫자를 다루는 클래스이다. 의 경우 정수형으로 표현할 수 있는 값을 다룰 때 사용하고 은 소수점이 있는 수를 다룰…

    innerHTML의 위험성, XSS에 대해 알아보자 cover image

    innerHTML의 위험성, XSS에 대해 알아보자

    레벨 1 과정에서는 Vanilla JavaScript로 미션을 구현하였다. 이때 DOM의 요소를 다루면서, innerHTML의 사용을 지양하라는 말을 많이 들었다. 성능상의 이유도 있었지만, XSS 공격에 취약하기 때문이라고 하였다. 그래서 XSS …

    다크모드의 의의와 웹환경에서의 구현 cover image
    #ui/ux

    다크모드의 의의와 웹환경에서의 구현

    구글, 애플이 도입한 다크모드 몇 년 전부터 일상 디지털환경에 다크모드란 기능이 자연스럽게 자리 잡았습니다. 정확한 시점을 특정할 수는 없으나 IT대기업들이 다크 모드를 도입하면서 대중들이 해당 개념을 더욱 빨리 받아들였다는 것을 부인하긴 어려울 것…

    방어적 복사와 Unmodifiable Collection cover image
    #immutable

    방어적 복사와 Unmodifiable Collection

    방어적 복사 vs Unmodifiable Collection 불변 객체에 대해 공부할 때 자주 나오는 키워드들이다. 내부의 값을 안전하게 보장하기 위해 사용한다. 일급 컬렉션 를 예시로 들 것이다. 방어적 복사란? 생성자의 인자로 받은 객체의 복사…

    instanceof의 사용을 지양하자 cover image
    #java

    instanceof의 사용을 지양하자

    instanceof란? 우리는 종종 그림과 같이 부모를 상속해서 만들어진 자식 객체가 여러 타입인 경우에 특정 클래스가 맞는지 확인하기 위해 아래 코드와 같이 라는 메서드를 사용하곤 한다. 코드는 piece 객체가 Empty라는 클래스 타입인지 확…

    웹 MVC 각 컴포넌트 역할 cover image
    #java

    웹 MVC 각 컴포넌트 역할

    개발을 하다보면 여러 디자인 패턴을 마주하게 된다. 그 중 가장 자주 보는 디자인 패턴은 일 것이다. MVC 패턴의 각 컴포넌트(Model, View, Controller)는 담당하는 역할이 있다. 해당 패턴을 사용하기 앞서 어떤 컴포넌트가 무슨 역…

    상태 패턴(State Pattern)을 사용해보자 cover image
    #design-pattern

    상태 패턴(State Pattern)을 사용해보자

    🥰 😁 😐 😩 🤬 😴 상태(현재 진행중인 행위)를 나타내기 위해 어떤 방식을 사용해 왔는가? Enum 열거형(Enum) 이란 서로 연관된 상수들의 집합이다. 상태를 나타내기에는 정말 편리한 방식이라고 생각한다. 하지만 Enum 은 객체 지향적인 프로…

    자원을 자동으로 해제, try-with-resource cover image
    #java

    자원을 자동으로 해제, try-with-resource

    우리는 자바로 프로그램을 짜면서 시스템에 있는 자원들을 사용하게 됩니다. 자원 자체를 사용하는 것뿐만 아니라 사용이 끝났을 때 해제하는 것도 매우 중요한 일입니다. 자원 해제를 잊어버리거나, 예외 처리 과정 중에 해제가 이루어지지 않을 수 있습니다.…

    Transactional 어노테이션 cover image
    #spring

    Transactional 어노테이션

    @Transactional 스프링은 어노테이션을 이용한 선언적 트랜잭션 처리를 지원한다. 이번 글에서는 아래 내용에 대해 알아볼 것이다. 트랜잭션이 무엇인지 스프링에서 을 이용하여 트랜잭션 처리를 하는 방법 테스트 환경에서의 동작 트랜잭션(Tr…

    DTO의 사용 범위에 대하여 cover image
    #java

    DTO의 사용 범위에 대하여

    1. DTO란? DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans)입니다. 간략하게 DTO의 구체적인 용례 및 필요성을 MVC 패턴을 통해 알아볼까요? 🚀 1.1. MVC 패턴 MVC 패턴…

    호이스팅에 대한 오해와 진실 cover image
    #hoisting

    호이스팅에 대한 오해와 진실

    호이스팅에 대한 오해와 진실 호이스팅이란 뭘까? 솔직히 프로그래밍을 공부한 지 얼마 안 되었을 때는 호이스팅과 호스팅이 똑같은 말인 줄 알았다. 그리고 이 개념에 대한 뜻을 몇 번 훑어보고는 ‘아, 변수나 함수를 스코프 상단으로 끌어올리는 기술이구나…

    presentational and container 패턴이란 무엇인가 cover image
    #refactoring

    presentational and container 패턴이란 무엇인가

    ❗ 본 글은 Hook 개념이 없는 과거 리액트를 기준으로 쓰여진 글입니다. 리액트에서 과거에 자주 언급되고 활용되었던 패턴 중 라는 패턴이 있다. 처음 이 패턴을 소개한 Dan Abramov는 2019년 기준으로 현재는 이 패턴을 사용하지 말라고 …

    자바 제네릭(Generics) 기초 cover image
    #java

    자바 제네릭(Generics) 기초

    제네릭 클래스나 제네릭 메서드를 구현할 일이 거의 없어서 제네릭을 애매하게 알고 있었다. 나와 같은 상황인 초보 개발자분들도 많을 것 같아서 제네릭에 대해 정리하고자 한다. 모든 내용을 한 글에 담기는 너무 길어져서 이번 글은 기초적인 내용을 알아보…

    싱글톤(Singleton) 패턴이란? cover image
    #java

    싱글톤(Singleton) 패턴이란?

    이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라 생각한다. 싱글톤 패턴이란? 싱글톤(Singleton) 패턴의 …

    정적, 비정적 내부 클래스 알고 사용하기 cover image
    #java

    정적, 비정적 내부 클래스 알고 사용하기

    자바의 중첩 클래스(Nested Class)에는 여러 가지 종류가 있는데 그중 정적 내부 클래스와 비정적 내부 클래스에 대해 다뤄보고자 한다. 글에서 사용된 코드는 Github에서 확인할 수 있다. 중첩 클래스란 정적, 비정적 내부 클래스에 대해 다…

    AssertJ의 다양한 메소드 활용해보기. cover image
    #test

    AssertJ의 다양한 메소드 활용해보기.

    Junit에서 기본으로 제공하는 assertions 보다 AssertJ는 보다 많은 기능을 제공한다. 하지만 일반적으로 테스트할 때 항상 비슷한 형태로만 테스트하기 때문에 이번 포스팅에서는 AssertJ의 다양한 기능 중 사용에 도움이 될만한 내용들…

    OSIV와 Custom Interceptor를 같이 사용하기! cover image
    #jpa

    OSIV와 Custom Interceptor를 같이 사용하기!

    이번 포스팅은 OSIV(Open Session In View)와 관련해서 개발 중 발생한 예외에 관해서 이야기 하고자 한다. 제목에서 있듯 OSIV와 HandlerInterceptor에 대한 내용이므로 간단하게 두 개념에 관해 설명하고, 발생한 예외에 대해서 공유하고자 한다.

    다형성(Polymorphism)이란? cover image
    #java

    다형성(Polymorphism)이란?

    객체 지향 패러다임의 4가지 주요 특성인 “캡슐화”, “추상화”, “다형성”, “상속”. 개발자라면 이미 각각에 대해 완벽히 알고 있는 사람도 많을 것이고, 객체 지향을 공부해 본 사람이라면 한번 쯤은 들어보았을 내용이다. 이번 글에서는 그 중 “다…

    코드 커버리지(Code Coverage)가 뭔가요? cover image
    #java

    코드 커버리지(Code Coverage)가 뭔가요?

    팀 프로젝트 요구 사항 우아한테크코스에서는 레벨 3,4 과정에서 팀 프로젝트를 진행하였다. 레벨 3에서 서비스를 구현했다면, 레벨 4에서는 구현한 서비스에 대한 유지보수를 진행하였는데, 이때 유지보수와 더불어 서비스의 개선을 위한 몇 가지 요구 사항…

    JPA에서 Fetch Join과 Pagination을 함께 사용할때 주의하자 cover image
    #spring

    JPA에서 Fetch Join과 Pagination을 함께 사용할때 주의하자

    결론부터 말하면, One에서 Many를 fetch join 해야하는 경우 limit과 같은 절(Pagination을 위한)을 포함할 시 원하는 대로 결과나 나오지 않는다. 예제코드(+ 테스트코드)는 Github에서 확인할 수 있다. LIMIT 그리고…

    몸체가 비어있는 무한 루프 cover image
    #loop

    몸체가 비어있는 무한 루프

    2018년 자바 입문서 한 권을 다 읽고 고수가 된 마음으로 소켓 프로그래밍 퀴즈 게임을 만든 적이 있었다. 최근에 그때의 난 어떤 코드를 작성했을까.. 하고 코드를 살펴보다가 그 당시 나를 며칠 동안 괴롭혔던 문제에 관한 기억이 떠올랐다. 이번 글…

    Mockito, 이대로 괜찮은가? cover image
    #test

    Mockito, 이대로 괜찮은가?

    Mockito Mock 객체와 Mockito에 대한 설명은 스티치의 “Test Double을 알아보자”와 “Mockito와 BDDMockito는 뭐가 다를까?”를, 더 자세한 내용은 공식문서를 읽어보길 바란다. 간단하게 말하자면, Mockito는 단…

    ETag with Spring cover image
    #spring

    ETag with Spring

    ETag란 무엇일까? ETag 또는 Entity Tag는 월드 와이드 웹 프로토콜인 HTTP의 일부다. 그것은 HTTP가 웹 캐시 유효성 검사를 위해 제공하는 몇 가지 메커니즘 중 하나로, 클라이언트가 조건부 요청을 할 수 있게 한다. … ETag는…

    Collection.forEach와 Stream.forEach는 뭐가 ��다를까? cover image
    #stream

    Collection.forEach와 Stream.forEach는 뭐가 다를까?

    자바 반복문 알고 쓰자! 를 작성하다가 궁금해진 내용이다. 아래처럼 Collection.forEach 메서드로 반복할 때와 Stream.forEach 메서드로 반복할 때는 무슨 차이가 있을까? 결론부터 말하면 대부분의 경우에 별 차이 없다. 조금의 …

    이벤트 발행으로 비즈니스 로직 분리하기 cover image
    #event

    이벤트 발행으로 비즈니스 로직 분리하기

    서비스를 만들다 보면, 처음에는 단순한 crud로 시작했던 API도 점차 복잡한 연관 관계가 생기고, 동시에 처리해야 할 일들이 생긴다. 그리고 더욱 복잡한 기능을 구현하기 위해 외부 모듈이나 시스템을 연동하여 사용하면서 하나의 요청에 함께 묶여 수…

    외부 서버와의 통신을 테스트해보자 cover image
    #test

    외부 서버와의 통신을 테스트해보자

    메일을 주고 받을 때, RSS 피드를 읽어올 때, 크롤링을 할 때 등등 개발을 하다보면 외부서버와 연동되는 동작을 해야 할 때가 있습니다. 이러한 동작은 대부분 라이브러리를 통해 구현 하므로 라이브러리를 믿고 테스트 없이 사용하는 경우가 많습니다. …

    Spring Security가 적용된 곳을 효율적으로 테스트하자. cover image
    #security

    Spring Security가 적용된 곳을 효율적으로 테스트하자.

    Spring Security와 관련된 기능을 테스트하다보면 인증 정보를 미리 주입해야 하는 경우가 종종 발생한다. 기본적으로 생각할 수 있는 가장 간단한 방법은 테스트 전에 SecurityContext에 직접 Authentication을 주입하는 것…

    Mockito와 BDDMockito는 뭐가 다를까? cover image
    #spring

    Mockito와 BDDMockito는 뭐가 다를까?

    해당 게시글은 JUnit5.x를 기준으로 작성되었습니다. 우아한테크코스 레벨2 미션 중에 의문이 생긴 적이 있었다. 테스트 코드를 작성하려는데 어떤 부분에서는 mock 객체를 을 통해 사용하고, 어떤 부분에서는 을 통해 사용하는 것이었다. impor…

    Spring Boot에서 properties 값 주입받기 cover image
    #spring

    Spring Boot에서 properties 값 주입받기

    개요 Spring Boot를 이용해서 어플리케이션을 만들다 보면 외부에서 특정 값들을 주입받아야 하는 경우가 있다. 예를 들면 AWS의 특정 컴포넌트를 사용하기 위한 secret key가 될 수도 있고 외부 API를 사용하기 위한 API key가 될…

    프로퍼티 파일을 활용해 쉽게 실행 환경 분리하기 cover image
    #properties

    프로퍼티 파일을 활용해 쉽게 실행 환경 분리하기

    특정 데이터의 조회 기능을 구현하려는데 테스트에서 자꾸 의도와는 다른 데이터가 출력된다. 이런, 을 통해 주입되고 있는 기본 데이터가 자꾸만 방해한다. 프로덕션 코드의 실행에는 필요하지만, 테스트에는 필요하지 않은 데이터인데… 어떻게 제거할 수 없을…

    Entity Lifecycle을 고려해 코드를 작성하자 2편 cover image
    #jpa

    Entity Lifecycle을 고려해 코드를 작성하자 2편

    이번 편에서는 전편에서 해결하지 못한 부분이었던 “Spring Boot에서는 기본적으로 OSIV의 설정 값이 true인데도 불구하고 LazyInitializationException이 발생하는가?”에 대한 원인을 알아보고 이에 대한 해결책을 이야기해…

    제네릭을 사용하여 테스트 중복 제거하기! cover image
    #refactoring

    제네릭을 사용하여 테스트 중복 제거하기!

    문제 상황 안녕하세요. 👨‍💻 이번 포스팅에서는 반복되는 테스트를 어떻게 추상화할까? 라는 고민에 대한 글입니다. 아래의 테스트를 모두 작성하는 과정에서 중복 코드가 발생하고 테스트 코드가 유지보수 하기 어려워졌습니다. 인수테스트 컨트롤러 테스트 서비스…

    Spring Boot에서 DTO 검증하기 cover image
    #spring

    Spring Boot에서 DTO 검증하기

    검증이 왜 필요할까? 나이를 입력해야 하는 데 이름을 입력한다면? 전화번호를 입력해야 하는 데 이메일을 입력한다면? 데이터를 저장할 때 당신은 아무 값이나 저장할 것인가? 아니다. 입력 값이 유효한 값인지 확인을 하고 저장할 것이다. 그래서 제목에서…

    웹소켓에 대해 알아보자 cover image
    #websocket

    웹소켓에 대해 알아보자

    웹 개발을 처음 배우기 시작했다면 서버와 클라이언트의 통신은 모두 HTTP 프로토콜만 이용해서 이루어진다고 생각할 수 있습니다. 하지만 웹 개발을 하면서 채팅, 게임, 주식 차트 등의 실시간 통신이 필요한 서비스를 구현하려 하면 HTTP 프로토콜이 …

    Test Double을 알아보자 cover image
    #test-double

    Test Double을 알아보자

    테스트 더블(Test Double)이란? xUnit Test Patterns의 저자인 제라드 메스자로스(Gerard Meszaros)가 만든 용어로 테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체를 말한다. 영화…

    자바 빌드 도구 cover image
    #build

    자바 빌드 도구

    프로젝트를 진행하려고 할 때, 자바 빌드 도구를 선택해야 하는 순간은 찾아오기 마련이다. Gradle이 좋다는 말은 많이 들리는데, 전체적인 사용률은 Maven이 앞선다. Google Trands 지수로 Maven과 Gradle의 전세계 검색 통계를…

    Spring Boot에서 Spring Bean 초기화 과정에 대해 알아보자. cover image
    #spring

    Spring Boot에서 Spring Bean 초기화 과정에 대해 알아보자.

    Spring Boot를 사용하면 자연스럽게 Spring Bean을 직접 생성하고 사용할 일이 많아진다. 따라서 우리는 Spring Bean을 생성하는 방법은 당연히 알고 있어야 하고 더 나아가 어떠한 방식으로 등록되는지 알고 있어야 한다. 이 글에서…

    인수테스트에서 테스트 격리하기 cover image
    #test

    인수테스트에서 테스트 격리하기

    테스트 격리란? 우리는 테스트들이 서로 순서에 상관없이 독립적으로 수행되어야 한다는 것을 알고 있다. 마틴 파울러도 자신의 블로그에 비결정적 테스트의 문제점에 대해서 언급하며 그 원인으로 테스트 격리가 부족하게 될 때 비결정적 테스트가 된다고 했다.…

    Open Session In View cover image
    #transaction

    Open Session In View

    상황 이번 포스팅은 Spring boot와 JPA를 활용하여 개인 프로젝트를 개발 중 JPA의 예상치 못한 동작을 발견하게 되어 이를 공유하고자 작성하였다. 읽고 계신 분들도 상황을 보며 어떤 점이 이상한 것인지 예상해 보시고 아래의 답을 보면 좋을…

    Java의 문자열을 파해치자! cover image
    #java

    Java의 문자열을 파해치자!

    문자와 문자열 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체가 무엇인지 아는가? 그것은 바로 문자열(String) 객체이다. 문자열은 문자의 배열이다. “abc”라는 문자열은 ‘a’,‘b’,‘c’라는 문자를 나열한 배열인 것이다. 자바는 객…

    반복문에서 비동기 처리를 동기적으로 처리 cover image
    #javascript

    반복문에서 비동기 처리를 동기적으로 처리

    우아한테크코스 백엔드 과정을 하고 있는 필자는 프론트엔드(자바스크립트 및 기타등등) 왕초보다. 초보가 우테코 내의 프로젝트를 하는 중, 루프를 통해서 요청에 대한 응답을 동기적으로 처리하려다가 발견한 사실이 있다. 우선 예시 코드를 살펴보자. api…

    요청과 응답으로 엔티티(Entity) 대신 DTO를 사용하자 cover image
    #dto

    요청과 응답으로 엔티티(Entity) 대신 DTO를 사용하자

    처음 웹 애플리케이션을 개발하다보면, 많이 하는 실수 중 하나가 바로 요청과 응답으로 엔티티를 직접 사용하는 것이다. 다음은 컨트롤러에서 요청과 응답으로 엔티티를 직접 사용했을 때의 코드이다. 여러분은 혹시 이렇게 코드를 작성하고 있지 않은가? 만약…

    Entity Lifecycle을 고려해 코드를 작성하자 1편 cover image
    #jpa

    Entity Lifecycle을 고려해 코드를 작성하자 1편

    서비스를 개발하다보면 생각하지도 못한 부분에서 버그가 발생하는 때가 있다. 특히 프로젝트 막바지에 이런 경험을 한다면? 생각하기도 싫은 상황일 것이다. 레벨3 프로젝트를 진행하면서 이런 경험을 한 적이 있는데, 이 때 어려움을 겪은 부분을 공유해보고…

    상태 코드, 뭘 줘야할까? cover image
    #http

    상태 코드, 뭘 줘야할까?

    상태 코드란? 어떤 상태 코드를 전달할지 고민하기 전에, 간단하게 상태 코드란 무엇인지 간단하게 짚고 넘어가자. 상태 코드는 말 그대로 클라이언트와 서버 간의 통신상태를 나타내는 약속된 코드다. 클라이언트는 이 상태 코드를 통해서 서버에게 보낸 요청…

    자바 반복문 알고 쓰자! cover image
    #loop

    자바 반복문 알고 쓰자!

    반복문은 어떤 프로그래밍을 하든 기본 중의 기본이다. 우리는 처음 자바 문법 배울 때를 제외하고 반복문에 대해 다시 공부해본 적이 있는가? 있다면 이 글은 넘겨도 좋다. 다만 가장 빈번하게 사용하는 반복문을 너무 가볍게 여겨서는 안 된다. 이 글을 …

    JPA 사용시 테스트 코드에서 @Transactional 주의하기 cover image
    #jpa

    JPA 사용시 테스트 코드에서 @Transactional 주의하기

    서비스 레이어()에 대해 테스트를 한다면 보통 DB와 관련된 테스트 코드를 작성하게 된다. 이러면 테스트 메서드 내부에서 사용했던 데이터들이 그대로 남아있게 되어서 실제 서비스에 영향을 미칠 수 있기 때문에 테스트가 끝나면 지워야 할 필요가 있다. …

    API 문서 자동화 - Swagger 팔아보겠습니다 cover image
    #spring

    API 문서 자동화 - Swagger 팔아보겠습니다

    Spring REST Docs 같이 테스트 코드 작성하면서 문서화하는게 지겹다고요? 문서 화면을 알록달록 이쁘게 만들고 싶다고요? 간단한 코드로 컬러풀한 문서를 만든다!! Swagger가 있습니다. Swagger은 작성하기 어렵고 심지어 테스트까지 …

    토큰을 어디에 저장할까? cover image
    #token

    토큰을 어디에 저장할까?

    웹 서비스를 제공할 때 인증과 인가는 기본적으로 구현해야 하는 기능 중 하나입니다. 이를 구현하기 위해서 쿠키/세션을 이용할 수도 있고 토큰을 이용할 수 도 있는데, 토큰을 이용한다면 토큰을 어디에 저장해야 할지 생각해볼 필요가 있습니다. 웹 클라이…

    MockMvc VS RestAssured cover image
    #spring

    MockMvc VS RestAssured

    MockMvc와 RestAssured는 우리가 애플리케이션을 개발할 때 테스트를 편리하게 할 수 있게 해주는 유용한 테스트 도구이다. 이 두 가지 도구는 비슷하면서도 다르다. 상황에 맞게 적절한 테스트 도구를 활용할 수 있도록 눈에 띄는 몇 가지 차…

    사용성을 고려해 객체를 설계하자 cover image
    #oop

    사용성을 고려해 객체를 설계하자

    과도한 코드 분리에 대한 피드백 지하철 노선도를 만드는 미션을 수행하면서 다양한 리뷰를 받았다. 그 중에서 리뷰가 아니었다면 생각하지 못했을 부분을 소개해보고자 한다. 미션 요구사항 중 출발역에서 도착역으로 가는 경로를 구할 때 기준을 최단 거리, …

    API 문서 자동화 - Spring REST Docs 팔아보겠습니다 cover image
    #spring

    API 문서 자동화 - Spring REST Docs 팔아보겠습니다

    프로덕션 코드와 분리하여 문서 자동화를 하고 싶다고요? 신뢰도 높은 API 문서를 만들고 싶다고요? 테스트가 성공해야 문서를 만들 수 있다!! Spring REST Docs가 있습니다. API 문서를 자동화 도구로는 대표적으로 Spring REST …

    생성자 인자가 많을 땐? Builder! cover image
    #design-pattern

    생성자 인자가 많을 땐? Builder!

    생성자 인자가 많을 때 문제점 클래스를 설계하다 보면 필드 개수가 많아지는 경우가 생긴다. 이 때 다음과 같은 문제점들이 발생한다. 1. 선택적으로 생성자를 제공하고 싶은 경우 생성자가 너무 많아진다 아래와 같은 코드를 점층적 생성자 패턴이라 하며 …

    custom exception을 언제 써야 할까? cover image
    #exception

    custom exception을 언제 써야 할까?

    우아한테크코스의 두 크루인 오렌지와 우가 싸우고 있다. 왜 싸우고 있는지 알아보러 가볼까? 오렌지 : 아니 굳이 사용자 정의 예외 안 써도 됩니다!! 우 : 아닙니다!! 써야 합니다!!! 사용자 정의 예외(Custom Exception) 에 대한 둘…

    자원을 수정하는 HTTP 메서드 - PUT vs PATCH cover image
    #http-method

    자원을 수정하는 HTTP 메서드 - PUT vs PATCH

    들어가며 웹 API를 설계할 때, 최대한 Http 표준을 따라서 용도에 맞는 Http Method를 사용해야 한다는 것은 아마 많은 개발자들이 인지하고 있을 것이다. 이번 글에서는 Http Method 중 특히 자원(엔티티)을 수정하는 용도로 사용하…

    다이나믹 테스트(Dynamic Test)란? cover image
    #test

    다이나믹 테스트(Dynamic Test)란?

    다이나믹 테스트(Dynamic Test)란? 다이나믹 테스트에 대해 알아보기 전에 상대되는 개념인 정적 테스트와 함께 개념을 비교해서 특징을 한번 살펴보자. JUnit을 이용해서 테스트를 작성하게 되면 보통 라는 어노테이션을 사용해서 테스트 케이스를…

    SOLID 1편 SRP와 OCP cover image
    #oop

    SOLID 1편 SRP와 OCP

    이번 포스팅에서는 객체지향에서 대표적인 원칙이라고 할 수 있는 SOLID원칙에 대해서 알아보고자 한다. 하나의 포스팅에 모든 것을 작성하면 길어질 것 같아, 와 를 먼저 포스팅하고 2편에서 , , 를 설명할 것이다. 1 . SRP : 단일 책임 원…

    로그 전략을 통해 메시지를 남기자 cover image
    #spring

    로그 전략을 통해 메시지를 남기자

    웹이나 앱 어플리케이션을 개발하다 보면 어플리케이션의 상태를 확인하기 위해 로그를 남긴다. 그럼 로그는 왜 남길까? 보통 로그는 개발의 원활함을 위해, 에러 등을 확인하고 해결하기 위해, 보안의 의미로, 또는 마케팅 전략을 위해 남기기도 한다. 이런…

    else 예약어를 쓰지 않는다 cover image
    #object-calisthenic

    else 예약어를 쓰지 않는다

    The ThoughtWorks Anthology의 더 나은 소프트웨어를 향한 9단계: 객체지향 생활 체조 중 규칙 2에 대한 내용이다. 시작은 프리코스부터 필자는 현재 우아한 테크코스(이하 우테코)를 진행하고 있는데 우테코를 들어오기 위한 과정 중 …

    equals와 hashCode는 왜 같이 재정의해야 할까? cover image
    #java

    equals와 hashCode는 왜 같이 재정의해야 할까?

    equals와 hashCode는 같이 재정의하라는 말을 다들 한 번쯤 들어봤을 것이다. 대부분의 IDE Generate 기능에서도 equals와 hashCode를 같이 재정의해주며 lombok에서도 EqualsAndHashCode 어노테이션으로 같이…

    Spring에서 전역 예외 처리하기 cover image
    #exception

    Spring에서 전역 예외 처리하기

    Spring에서 예외 처리하는 방법은 여러 가지가 있다. 메서드에서 try/catch를 써서 처리할 수도 있고, 를 사용하여 컨트롤러 내에서 발생하는 예외를 처리할 수도 있다. 하지만 지금 알아볼 것은 전역에서 발생하는 예외를 처리하는 방법을 알아보…

    클라이언트에서 비동기 요청 시 최신 데이터를 가져오는 방법 cover image
    #asynchronous

    클라이언트에서 비동기 요청 시 최신 데이터를 가져오는 방법

    클라이언트 쪽 개발을 하다보면, 서버에 특정 자원을 생성하는 요청을 보내고, 요청이 성공한다면 해당 내용을 화면에도 즉각 반영해야 하는 상황을 종종 마주한다. 이 경우, 우리는 생성과 조회를 한번에 해결하는 API 요청을 보냄과 동시에 반환되는 새로…

    CORS란? cover image
    #architecture

    CORS란?

    웹 개발을 하다 보면 한 번쯤은 부딪히게 되는 주제가 CORS이다. 이 포스팅에서는 CORS가 무엇이며 CORS 예외를 어떻게 해결해야 하는지 알아보자. 배경 및 정의 기존 브라우저 정책은 서로 다른 도메인으로부터 리소스가 필요한 경우, 보안상의 이…

    왜 Constructor Injection을 사용해야 하는가? cover image
    #spring

    왜 Constructor Injection을 사용해야 하는가?

    Spring의 DI, 그리고 IoC 글의 본문을 들어가기 이전에 글에서 주로 언급하게 될 DI의 개념에 대해 짚어보고 가겠다. DI는 Dependency Injection, 말 그대로 의존성 주입을 말한다. 이는 객체 간의 의존성을 외부에서 주입하여…

    Functional Interface란 cover image
    #interface

    Functional Interface란

    Java8부터 함수형 프로그래밍을 지원한다. 함수를 일급객체처럼 다룰 수 있게 제공하는 Functional Interface에 대해 알아볼 것이다. Functional Interface란? 단 하나의 추상 메서드를 가지는 인터페이스. - Java L…

    Reflection API 간단히 알아보자. cover image
    #reflection

    Reflection API 간단히 알아보자.

    Spring Framework를 학습하다 보면 Java Reflection API를 자주 접하게 된다. 하지만 Reflection API는 자바 입문서에 잘 나오지 않는 내용이기 때문에 나와 같은 초보 개발자들에겐 다소 생소한 내용이다. 이 글을 통…

    정적 메소드, 너 써도 될까? cover image
    #static

    정적 메소드, 너 써도 될까?

    static이 붙은 녀석들은 JVM이 시작될 때 Method(static) 영역에 저장된다. 그리고 프로그램이 끝날 때까지 사라지지 않고 메모리에 남아있다. (자바 기준) 이번 글에서는 그중에서도 정적 메소드(static method)에 대해 이야기…

    반복적으로 사용되는 인스턴스 캐싱하기 cover image
    #cache

    반복적으로 사용되는 인스턴스 캐싱하기

    캐싱(Caching)이란 캐싱을 알아보기 전에 캐시의 사전적인 정의를 알아보자. 캐시(cache)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경…

    String 클래스를 조심히 사용하자. cover image
    #class

    String 클래스를 조심히 사용하자.

    자바로 프로그래밍 할 때 java.lang.Object와 기본 자료형(Primitive Object)을 제외하고 가장 많이 사용하는 객체는 String 클래스일 것이다. String 클래스는 잘 사용하면 상관이 없지만, 잘못 사용하면 메모리와 성능에…

    VO(Value Ojbect)란 무엇일까? cover image
    #value-object

    VO(Value Ojbect)란 무엇일까?

    프로그래밍을 하다 보면 VO라는 이야기를 종종 듣게 된다. VO와 함께 언급되는 개념으로는 Entity, DTO등이 있다. 그리고 더 나아가서는 도메인 주도 설계까지도 함께 언급된다. 이 글에서는 우선 다른 개념들을 뒤로하고, VO의 정의와 생성 조…

    한 메서드에 오직 한 단계의 들여쓰기만 cover image
    #object-calisthenic

    한 메서드에 오직 한 단계의 들여쓰기만

    Object Calisthenics Rule 1: One level of indentation per method 객체지향 생활 체조의 규칙 1을 보면 메서드당 들여쓰기 한 번이라고 한다. 🤔흠…왜…굳이? 이곳의 말을 부분 인용하면 (…은 생략된 부…

    디미터 법칙(Law of Demeter) cover image
    #law-of-demeter

    디미터 법칙(Law of Demeter)

    디미터 법칙은 “Object-Oriented Programming: An Objective Sense of Style”에서 처음으로 소개된 개념이다. 이 글의 저자들은 디미터라는 이름의 프로젝트를 진행하던 도중 다른 객체들과의 협력을 통해 프로그램을…

    원시 타입을 포장해야 하는 이유 cover image
    #oop

    원시 타입을 포장해야 하는 이유

    변수를 선언하는 방법에는 두 가지가 있다. 원시 타입의 변수를 선언하는 방법과, 원시 타입의 변수를 객체로 포장한 변수를 선언하는 방법이 있다. (Collection으로 선언한 변수도 포장한다. 이를 일급 컬렉션이라 하며 티거의 일급 컬렉션을 참고하…

    정적 팩토리 메서드(Static Factory Method)는 왜 사용할까? cover image
    #static-factory-method

    정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?

    정적 팩토리 메서드를 들어본 적이 있는가? 프로그래밍을 시작한 지 얼마 안된 사람도 정적 팩토리 메서드라는 단어를 한번쯤은 들어봤을 것이다. 그리고 아마 프로그래밍을 조금 해본 사람들은 정적 팩토리 메서드라는 용어에 많이 익숙해져 있고 실제로도 자주…

    new ArrayList<>() vs Arrays.asList() cover image
    #collection

    new ArrayList<>() vs Arrays.asList()

    List를 만들때 대부분은 와 를 사용하여 만든다. 그럼 와 의 차이를 알고 사용하고 있는가? 이번 글에서는 두개의 차이점을 알아볼 것이다. 1. return type 와 는 다른 클래스다. 는 ArrayList를 는 Arrays의 정적 클래스인 A…

    불변객체를 만드는 방법 cover image
    #immutable

    불변객체를 만드는 방법

    이번 글에서는 불변 객체로 만들어야 할 때 어떠한 방법으로 만들 수 있는지에 대해 이야기해보고자 합니다. 주로 클래스를 불변 클래스로 만드는 방법에 관해서 이야기 할 예정입니다. Immutable Object(불변 객체)란? 위키피디아에 의하면 를 …

    상속보다는 조합(Composition)을 사용하자. cover image
    #oop

    상속보다는 조합(Composition)을 사용하자.

    우리는 다양한 이유로 상속을 사용한다. 코드를 재사용함으로써 중복을 줄일 수 있다. 변화에 대한 유연성 및 확장성이 증가한다. 개발 시간이 단축된다. 하지만, 상속의 장점들은 상속을 적절히 사용했을 경우에만 해당한다. 상속을 잘못 사용하면 변화에 유…

    인터페이스를 분리하여 테스트하기 좋은 메서드로 만들기 cover image
    #interface

    인터페이스를 분리하여 테스트하기 좋은 메서드로 만들기

    이전 글에서 메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기에서는 테스트하기 어려운 메서드의 시그니처를 수정하여 테스트하기 쉽게 바꾸는 방법을 알아보았다. 해당 방법은 테스트하기 어려운 의존을 매개변수를 통해서 전달받도록 수정하여 메서드가…

    Stream의 foreach 와 for-loop 는 다르다. cover image
    #stream

    Stream의 foreach 와 for-loop 는 다르다.

    Stream에 대한 기본적인 학습을 위해 찾아왔다면, 공식 오라클 문서를 참고하면 좋을 것 같다. (java8 부터는 Stream과 Lambda를 제공한다.) 자바에서 Stream은 컬렉션 등의 요소를 하나씩 참조해 함수형 인터페이스(람다식)를 통…

    하나의 메서드는 하나의 기능을 수행하자 cover image
    #clean-code

    하나의 메서드는 하나의 기능을 수행하자

    우리는 프로그래밍을 하면서 수많은 메서드들을 작성한다. 그렇다면 우리가 작성하는 프로그래밍에서의 메서드란 무엇일까? 객체 지향 프로그래밍에서 메서드는 객체간의 협력하는 구조를 설계하고 구현하기 위해서 반드시 필요한 객체의 행동에 해당한다. 하지만 구…

    일급 컬렉션을 사용하는 이유 cover image
    #object-calisthenic

    일급 컬렉션을 사용하는 이유

    일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언급되었다. Collection을 W…

    메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기 cover image
    #refactoring

    메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기

    테스트 코드의 중요성 테스트 코드를 작성하면 어떤 점이 좋을까? 우리는 왜 시간을 들어가며 테스트 코드를 작성해야 할까? 테스트 코드를 작성함으로 얻을 수 있는 장점은 여러 가지가 존재한다. 제품의 안정성을 높여준다. 기능의 추가 및 수정으로 인한 …

    하드코딩을 피해라. cover image
    #hard-coding

    하드코딩을 피해라.

    안 좋은 코딩 습관을 얘기할 때면 꼭 언급되는 것이 하드코딩이다. 선배 개발자들은 하드코딩을 피하며 코딩하는 것이 당연하지만, 초보 개발자들은 하드코딩이 뭔지, 왜 하면 안 되는 것인지 모르는 경우가 대부분이다. 하드코딩이란? 프로그램의 소스 코드에…

    반복문(iteration) vs 재귀(recursion) cover image
    #clean-code

    반복문(iteration) vs 재귀(recursion)

    반복문과 재귀함수 프로그램은 반복되는 작업을 수행하도록 설계된다. 따라서 반복을 구현하는 로직은 필수적이고 프로그래밍 언어마다 for, while 같은 기본적인 반복 제어문을 지원하고 있다. 반복되는 작업은 기본 제어문을 통해서 뿐만 아니라 재귀함수…

    getter를 사용하는 대신 객체에 메시지를 보내자 cover image
    #object-calisthenic

    getter를 사용하는 대신 객체에 메시지를 보내자

    getter는 멤버변수의 값을 호출하는 메소드이고, setter는 멤버변수의 값을 변경시키는 메소드이다. 자바 빈 설계 규약에 따르면 자바 빈 클래스 설계 시, 클래스의 멤버변수의 접근제어자는 private이며, 모든 멤버변수에 대해 get메소드와…

    메소드 시그니처를 변경하지 않고, 테스트 가능한 구조 만들기. cover image
    #refactoring

    메소드 시그니처를 변경하지 않고, 테스트 가능한 구조 만들기.

    메소드 시그니처를 변경하지 않고 테스트하기 메소드 시그니처란 메소드의 이름, 파라미터, 반환값의 데이터 타입을 통칭하는 말이다. 프로그래밍을 하다 보면 기존의 메소드 시그니처를 변경하지 않으면서 테스트 가능한 구조로 변경해야 하는 경우가 종종 있다.…

    좋은 코드를 위한 자바 메서드 네이밍 cover image
    #naming

    좋은 코드를 위한 자바 메서드 네이밍

    네이밍이 중요한 이유 클린 코드 참조 코드를 작성한 의도와 목적이 명확해야 하며 다른 사람이 쉽게 읽을 수 있어야 하기 때문이다. 왜 그래야 하나? 코드의 가독성이 좋아진다. 그러면 뭐가 좋나? 다른 사람이 코드를 이해하는데 들이는 시간을 최소화하는…

    하나의 테스트 케이스는 단위 기능 중 하나의 시나리오만 테스트하라 cover image
    #test

    하나의 테스트 케이스는 단위 기능 중 하나의 시나리오만 테스트하라

    단위 테스트(Unit Test)란 단위 테스트란 메서드를 테스트하는 또 다른 메서드이다. 하나의 단위 테스트는 하나의 메서드의 특정 루틴을 검사한다. 라는 메서드가 테스트 할 수 있는 방법은 2가지가 있다. 가 5보다 커서 를 리턴하는 경우 가 5보…

    좋은 코드를 위한 자바 변수명 네이밍 cover image
    #naming

    좋은 코드를 위한 자바 변수명 네이밍

    JAVA 변수명 네이밍 규칙 보통 읽기 좋은 코드를 좋은 코드라고 한다. 변수, 메소드, 클래스 등의 이름이 일관성이 없고 그것의 쓰임을 분명히 나타내지 않는다면 어떨까? 코드의 유지보수가 어려워진다. 이름만 보고 쓰임을 알 수 없으면, 코드를 읽고…