[Spring] Spring MVC는 어떻게 요청에 응답할까? (Dispatcher Servlet을 중심으로)
2023. 3. 16. 03:47
Spring
0. 들어가며 🏃🏻♂️ 스프링 MVC를 사용하면 클라이언트에 요청에 따라 적절한 응답을 만들어낼 수 있습니다. 그 과정을 대략적으로나마 알고있었지만 이를 좀 더 명확하게 정리하는 시간을 가지고자 Dispatcher Servlet을 중심으로 스프링이 어떤 방식을 사용해 요청에 응답하는지 알아보도록 하겠습니다. 1. Spring MVC Cycle을 Dispatcher Servlet과 함께 살펴보기 😀 위 그림은 Spring MVC 구조입니다. 실제로는 Dispatcher Servlet에 요청이 들어가기 전 필터를 거치는데 이 부분은 생략되어 있습니다. 처음 볼때는 한눈에 잘 들어오지 않는 구조라 구조의 중심이 되는 Dispatcher Servlet 내부를 살펴보며 한단계 한단계 살펴보도록 하겠습니다. 0...
[Java] Arrays.asList 와 List.of 의 차이점에 대하여.
2023. 3. 9. 18:20
Java & Kotlin
0. 들어가며 🏃🏻♂️ 자바에서는 간단하게 List를 초기화하려할때 Arrays.asList, List.of와 같은 메서드의 도움을 받기도 합니다. 두 메서드는 비슷한 역할을 하는 것 같은데 차이점이 무엇인지에 대해 궁금증이 생겨 글을 정리하게 되었습니다. 1. Arrays.asList 메서드 Arrays.asList는 자바 1.2에서 생긴 메서드로 List 객체를 보다 편하게 생성할 수 있도록 도와주는 메서드입니다. 사용법은 간단하므로 예시를 통해 알아보도록 하겠습니다. // 사용법1 List asList = Arrays.asList(1, 2, 3, 4); System.out.println("asList = " + asList); // asList = [1, 2, 3, 4] // 사용법2 Intege..
[프로그래머스] 길 찾기 게임 - Python
2023. 3. 1. 05:12
Algorithm/프로그래머스
🤔 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 😀 풀이 위 문제는 BST를 구현해본 경험이 있다면 쉽게 풀이할 수 있는 문제입니다. 전체적인 풀이 방향이 BST의 insert, 전위 순회, 후위 순회를 구현하는 문제이기 때문에 이에 대한 내용을 중점적으로 설명해보도록 하겠습니다. 먼저 문제에서 y축의 크기가 클수록 BST 상단에 위치해야하므로 아래 코드와 같이 문제에서 주어진 nodeinfo를 정렬해줍니다. 이때 노드의 y값을 기준으로 정렬합니다. y값을 기준으로 정렬하게 되면 순서대로 노드들을 확인했을 때 부모 노드부터 트리에 삽입할 수 있게 ..
[Spring & Project] 소셜로그인 기능에 전략 패턴을 적용하기
2023. 2. 18. 03:44
Spring/Project
0. 들어가며🏃🏻♂️ 진행했던 프로젝트에서 구글과 카카오 소셜로그인 기능을 구현했었는데 해당 코드를 다시 살펴보며 리팩토링하면 좋겠다 싶은 부분을 발견했습니다. 이번 글에서는 디자인 패턴 중 하나인 전략 패턴(Strategy Pattern)을 적용해 리팩토링해본 경험을 정리해보려 합니다. 1. 기존의 코드는..🤔 기존 코드에서는 구글 로그인과 카카오 로그인을 각각 다른 API로 처리하였습니다. 간략하게 아래와 같은 형태였죠. @GetMapping("/google/login") fun googleLogin(...) { 구글 로그인... } @GetMapping("/kakao/login") fun kakaoLogin(...) { 카카오 로그인... } 기능은 잘 동작했지만, 거의 같은 기능을 하는 API가..
[Spring & JPA] N + 1 문제에 대하여.
2023. 2. 1. 19:17
Spring/JPA
0. 들어가며 🏃🏻♂️ 이번 글에서는 JPA를 사용할 때 중요한 개념인 N + 1 문제에 대해 알아보려합니다. N + 1 문제는 JPA를 처음 공부할 때부터 중요하다고 들었고, 이에 대한 해결법 역시 대략적으로 알고있다고 생각했습니다. 그런데 막상 실제 프로젝트에서 엔티티가 여러 OneToMany, ManyToOne 필드들을 가지게되고 서로 얽혀있다보니 이를 다루는 방법을 잘모르겠어서 애를 먹은 경험을 했습니다. 또한 N + 1 문제를 해결하기 위해 사용하는 방법들이 어떤 쿼리를 날리길래 해당 문제를 해결하는지, 어떤 방식으로 동작하는지에 대해서도 모르고 사용한다는 생각이 강하게 들었습니다. 이를 위해 N + 1 문제에 대해 조금 더 깊게 알아보는 시간을 가져보았고, 이를 정리해보려합니다. 결론부터 말..
[Spring & Project] 채팅 읽음 확인 기능 구현하기
2023. 2. 1. 00:10
Spring/Project
0. 들어가며 🏃🏻♂️ 진행중인 팀 프로젝트에서 웹소켓을 통해 실시간 채팅 기능을 구현했습니다. 채팅기능을 구현한 이후 상대방이 채팅을 읽었는지 여부를 확인할 수 있으면 좋겠다는 의견이 나와 이를 구현하게 되었고, 해당 요구사항을 반영하기 위해 고민했던 과정들을 블로그에 정리해보려 합니다. 1. 요구사항📕 변경된 요구사항은 "아래 사진과 같은 기능을 추가하자" 였습니다. 위 사진처럼 빨간 박스로 쳐진 부분과 같이 읽지 않은 메시지를 표시하는 기능이 있다면 좀 더 서비스 경험이 좋아질 것이라는 의견이 있었고, 이 부분을 새롭게 구현해야 했습니다. 2. 고민해야했던 점 과 구현한 방식 🤔 먼저 고민했던 부분은 기존 구조로는 채팅을 읽었는지 여부를 알기가 어려워 어떤 정보를 추가해야할지를 결정하는 것이었습니..
[Spring & Dev] 웹소켓에 대하여.
2023. 1. 14. 20:16
Spring
0. 들어가며🏃🏻♂️ 진행 중인 팀 프로젝트에서 실시간 채팅 기능을 구현하기 위해 웹소켓을 사용해보았습니다. 예전 수업 과제로 실시간 코인 거래소를 만든 경험이 있는데 이 때는 Polling을 사용했어서 이번에도 그러면 되겠다라고 생각하고 있던 도중 실시간 채팅에 대해 조금 검색해 보니 웹소켓이라는 키워드를 발견할 수 있었습니다. 이번 글에서는 HTTP로 실시간 서비스를 구현하는 방법에 대해 먼저 알아보고 이를 통해 웹소켓이라는 프로토콜이 왜 등장하게 되었는지에 대해 알아보도록 하겠습니다. 또한 웹소켓 프로토콜이 무엇인지, 동작 방식은 어떤지 등에 대해 알아보고 Spring에서 웹소켓 구현은 어떻게 하는지 간단하게 알아보도록 하겠습니다. 1. 실시간 서비스를 HTTP로 구현해보기🏀 0) 실시간 서비스..
[Git] Merge 전략에 대하여.
2022. 12. 27. 01:04
Dev.
0. 들어가며 🏃🏻♂️ 프로젝트를 혼자서 진행할 때는 대부분 main 브랜치에서 작업하거나 간단하게 브랜치를 파서 작성한 후 별 생각 없이 merge 하는 것을 반복하곤 했습니다. 최근 경험한 협업 프로젝트에서는 각 팀원들이 feature 브랜치를 통해 기능 개발을 한 뒤 main 브랜치에 merge하는 과정을 거쳐야 했습니다. git에서는 여러 가지 merge 전략이 있으며, 전략에 따라 커밋 히스토리가 크게 달라집니다. 이에 따라 저희 팀 상황에 맞는 merge 전략이 무엇일지 알아보는 시간을 가져보았습니다. 이번 글에서는 git merge 전략에 대해 정리해보도록 하겠습니다. 1. Merge 🍎 두 브랜치를 합치는 가장 기본적인 방법으로 일반적인 Merge 명령어가 있습니다. 상황 설명을 위해 아..
[Java] Enum에 대하여.
2022. 10. 13. 23:05
Java & Kotlin
0. 들어가며🏃 지난 글에서 상수를 관리하는 방법으로 유틸리티 클래스를 사용하는 방식을 살펴보았습니다. [Java] 상수들을 관리하는 방법에 대하여. 0. 들어가며🏃 코드를 작성하다 보면 상수를 정의하는 경우가 많이 있습니다. 저 역시 최근 자바 코드를 작성하면서 상수들을 하나하나 정의하다 보니.. 그 수가 많아져 이를 관리해야할 필요성 kjhoon0330.tistory.com 상수를 선언하기 위한 유틸리티 클래스는 직관적이고 그럴듯해 보이지만 몇몇 상황에서 불편한 점이 있습니다. 예시 코드를 통해서 한번 살펴보도록 하죠. class Fruit { // 정수 열거 패턴 static final int APPLE = 1; static final int GRAPE = 2; static final int STR..
[Java] 상수들을 관리하는 방법에 대하여.
2022. 9. 17. 00:27
Java & Kotlin
0. 들어가며🏃 코드를 작성하다 보면 상수를 정의하는 경우가 많이 있습니다. 저 역시 최근 자바 코드를 작성하면서 상수들을 하나하나 정의하다 보니.. 그 수가 많아져 이를 관리해야할 필요성을 느끼게 되었습니다. 상수를 어떻게 관리하면 좋을지 고민하다가 도움이 된 자료들이 있어 이번 글에서는 이에 대한 내용을 정리해보려 합니다. 1. 상수를 관리하는 방법 중 안티 패턴💀 우선 자바에서 상수를 관리하는 방법 중 안티 패턴으로 알려진 몇 가지 방법을 먼저 소개하겠습니다. 1) Magic Number if (nubmer == 3.1415) {...} // 3.1415 => Magic Number 위 코드의 3.1415 같은 수를 Magic Number라고 칭하는데 위와 같이 코드를 작성하면 다음과 같은 문제들이..