Categories

🌱 Java & Spring 🌱

코드로 이해하는 Red-Black Tree의 연산과 Java TreeMap에서의 구현

1. Red-Black Tree란레드 블랙 트리란 Balanced Binary-Search Tree로, 모든 노드들을 빨간 색 혹은 검은 색으로 칠해 놓았기 때문에 레드-블랙 트리라고 부른다.  위 글을 보면 Red-Black 트리라는 이름의 어원을 알 수 있다.어이 없지만, 이런 이유로 Red-Black 트리이다! 트리를 처음 고안한 논문의 저자들이 사용할 수 있었던 프린터가 만들어낸 가장 "멋진"색이기 때문이라고 한다. 레드 블랙 트리는, 이런 빨강-검정으로 트리의 노드들을 색칠하고, 색에 대한 규칙을 세워 규칙을 어기는 경우 다시 균형을 맞춰 높이를 낮춘다. 균형을 맞추는 트리들이 균형을 맞추는 이유는 트리 Depth를 줄여 빠르게 탐색하기 위해서이다! 편향된 트리를 보면 알겠지..

🌌 OOP 🌌

Law of Demeter

발표 영상 (글이 훨씬 낫습니다.) : https://youtu.be/tdXd-f7QCnE?si=PidTl2ND8x4NxvdK&t=306 디미터 법칙은 "제우스"라는 하드웨어를 만드는 프로젝트 "Project Demeter" 중 소프트웨어 엔지니어링 관점에서 고민하고 느낀 점을 토대로 기술되었다. 객체의 자율성을 높혀 직접 협력하도록 만들어, 객체간 결합도를 낮추고, 응집도를 높히는 법칙이며, 갭슐화를 위한 구체적인 지침이다. 우리는 왜 객체지향을 공부해야 할까? 좋은 객체지향 설계란 무엇일까? 그저 다들 인프런 김영한 강사님 강의를 듣고, 대한민국에서 취직이 잘 된다고 하니 자바와 스프링을 공부해야 하는걸까? 자바와 스프링을 배우다 보면 자꾸 객체지향이라는 용어가 나오니까 SOLID와 캡상추다를 줄줄줄..

🌱 Java & Spring 🌱

Java 인터페이스의 OOP적인 활용

1. 인터페이스란? 1.1 처음보는 전자레인지로 음식을 데우는 방법 위 사진은 구글에 `전자레인지`라고 검색했을 때 나오는 사진들 중 아무 사진이나 가져온 것이다. 이 전자렌지로 어제 먹고 남은 치킨을 데워달라. 할 수 있겠는가? 쉽다. 문을 열고, 치킨을 넣은 다음 문을 닫고, 아래에 시간으로 추측되는 숫자들이 적힌 다이얼을 돌리고 기다리면 따뜻하고 눅눅한 치킨이 나오게 된다. 우리는 오늘 처음 보는 이 전자레인지로 차디찬 닭고리를 데웠다. 내가 전자레인지라고 알려주지 않아도 데울 수 있었을 것이다. 어떤 원리로 음식이 데워지는가? 이에 대한 지식이 있는 사람이라면 대답할 수도 있다. 마이크로파를 이용해 데웠다. 그럼 마이크로파를 쬐면 왜 데워지는가? 마이크로파가 음식물에 있는 물 분자에 흡수되면, 물..

🌱 Java & Spring 🌱

자바의 Type에 대해

컴퓨터는 계산을 위해 태어났다. 복잡한 계산을 위해선 값과, 값을 저장할 수 있는 기능이 필요했다. 컴퓨터가 다룰 수 있는 값은 본질적으로 010101과 같은 숫자로 이루어져 있어야 하는데, 인간의 편의를 위해 단순 정수 말고도 좀 더 다양한 형식의 자료들을 연산할 필요가 있었다. 그래서 이진수로 다양한 값의 종류를 표현했는데, data의 type에 따라 저장될 공간의 크기와 형식이 다르게 되었다. 이러한 자료의 형태를 자료형이라고 부른다. 이러한 자료형은 크게 기본형과 참조형으로 나뉘게 되는데, 기본형은 말 그대로 컴퓨터가 표현할 수 있는 문자, 정수, 실수 등의 기본적인 data type이고 참조형은 내가 저장하고 싶은 데이터의 주소값을 가지고 있는 type이다. 자바에서는 보통 객체의 인스턴스가 저..

🚀 PS! 🚀/🤖 Algorithm 🤖

배낭 문제를 풀어내는 다양한 방법들! greedy, dp, backtracking, branch & bound

목차 knapsack 문제는 무게 제한이 있는 가방에, 무게 제한을 지키면서도 배낭에 담긴 물건의 가격의 합이 가장 큰 경우를 알아내는 문제이다. 이런 배낭 문제를 푸는 다양한 방법을 소개할 것이다. 그리디한 방식과 그 한계 일반적인 동적 계획법과 개선된 버전 backtracking - dfs 그리고 BFS를 이용한 분기 한정법 (dfs 보다 더 나을게 없다.) 이를 개선한 Best First Search를 이용한 분기 한정법! 이렇게 5가지 방식을 소개할 것이다. 1. 배낭 문제와 그리디한 풀이 knapsack 문제는 배낭에 물건을 채우는 문제이다. 보통 물건들의 무게와 그 가격이 정해져 있는 상황이 주어지고, 최대 이득이 되는 만큼 물건을 채워야 하는 문제이다. 배낭은 감당할 수 있는 무게의 상한이 ..

🌱 Java & Spring 🌱

Lambda & Stream의 도입 배경과 원리, 최적화 전략! 알고 쓰자!!!

람다와 스트림은 원리도 모른 채 사용되는 경우가 많다. 인텔리제이 자동완성, Chat GPT와 코파일럿이 기가 막히게 알려주는데 왜? 알아야? 하지? 싶을 수 있다. 개인적으로 그냥 달달 외워서 사용하는 것을 매우 지양하기 때문에 이번에는 최대한 사용법 보다는 도입 배경이나 원리를 중심으로 얘기해보고 싶어서 글을 써 보았다. 단순 문법은 검색하면 바로 알 수 있다. 중요한건 원리 이해를 기반으로 한 제대로 된 활용이라고 생각한다. 여기에선 도입 배경과 원리, 최적화 전략 등을 알아보자. 재미있는 이야기들이 있다. 1. Lambda Expression 1.1 람다 도입 배경 프로그래밍 언어는 생물처럼 진화한다. 어떤 방향으로 발전하던지 혹은 발전하지 않던지, 환경에 잘 어울리면 살아남고, 어울리지 않으면 ..

🔥 Projects 🔥

[충격] S3 배포시 '이것' 설정 안 하자... 개인정보 '술술'

[이 글에서 결국 하고 싶은 말] 1. S3 + CloudFront를 통해 클라이언트를 배포할 때는 사용할 때는 S3 웹 호스팅을 기능을 비활성화 한 다음에, 버킷 엔드포인트과 CloudFront를 연결한 다음 OAC 설정하고, S3 정책을 작성하여 CloudFront에서만 접근하도록 설정하세요. 2. OAI 대신 새로 도입된 OAC에 대한 간단한 설명과 S3 버킷의 파일을 안전하게 보호하기 위한 Access 설정, S3 Bucket 정책을 작성하는 방법을 알려드립니다. 3. 소소하게, S3로 정적 프로젝트 배포시 CloudFront를 사용하는 장점과 S3 버킷의 파일들을 CloudFront를 통해 배포하는 방법도 알려드립니다. 안녕하세요? 이진호 TV의 이진호입니다. 오늘은 React Project를 ..

🌱 Java & Spring 🌱

바이트 코드를 JVM에 싸서 드셔보세요

JVM은 자바 기본서를 피면 가장 앞에 나온다. 분명 살면서 몇 번을 읽었지만, 누가 물어보면 자세히 답변이 어려운 것을 모두가 공감할 것이다. 대충 어찌어찌 해서 바이트 코드가 만들어지고, 그걸 실행 시켜서 어떤 OS 위에서도 잘 돌아가게 해주는 가상머신 아닌가..? 이런 답변만이 머릿 속을 맴돌 뿐이다.. JDK와 JRE는 봐도 봐도 헷갈리고 모호하다 이번 기회에 확실하게 알아보자. JVM과 바이트 코드가 뭐 하는 물건인지? JVM에서 말하는 컴파일과 코드를 실행 과정은 어떻게 이루어지는지? 긴 여정속에서 함께할 동료들은 어떤 친구들이 있는지? 복잡하고 아름다운 JVM의 내부 구조와 함께 한번 알아보자. 사실 가장 아래 래퍼런스들의 문서를 읽는 것이 더 도움이 될 것 같다. 1. JVM이란 무엇인가 ..

💾 Database Systems 💾

[DB] 코드로 이해하는 B+Tree 연산 과정

트리 기반 인덱싱에 자주 쓰이는 자료 구조인 B+Tree에 대해 공부하면서, 구체적으로 코드는 어떻게 이루어져 있는지에 대한 궁금증이 있었다. 호기심으로 살펴본 코드를 직접 한줄 한줄 보는 과정에서 많은 괴로움이 있었지만, B+Tree에 대해 더 제대로 이해할 수 있었던 것 같다. 직접 작성한 코드는 아니지만, 한줄 한줄 읽기 쉽게 변수명이나 코드를 정말 많이 수정했다. 그리고 최대한 모든 요소에 대한 주석을 직접 달았다. 이론을 먼저 살펴보고, 코드를 보며 제대로 이해해보자. 1. 동적 인덱스 구조 B+Tree B+Tree는 트리 구조의 일종으로 동적 인덱스 구조를 가지고 있다 B+Tree는 DB에서 인덱싱을 위해 사용하는 자료구조로, 노드 별로 M개의 데이터를 저장하는 트리이다. 이분 탐색 트리나 힙..

🔥 Projects 🔥

[Nginx] Don't try this at home - "IF" is Evil

Nginx if is evil Don't try this at home You were warned 미국 공포 영상이나 위험한 과학 실험 영상의 썸네일이나 제목을 보면 위와 같은 문구가 작성 되어 있다. 위의 문구는 NGINX 공식 홈페이지의 어떤 문서의 예제 위에 적혀 있는 문구이다. 예제를 따라하지 말라고 경고하고 있다. Nginx를 사용하며 if를 사용할 일은 꽤 많다. CORS 처리엔 필수적이고, 메서드나 소스에 따른 처리가 필요할 때가 있다. 그럼에도 Nginx if는 매우 매우 불친절하다. 또 단순히 불친절 한줄만 알았는데, 악마적인 모습 또한 감추고 있다. Nginx의 설정파일을 작성할 때 if를 사용하는 경우와 if의 불친절함, 그리고 Nginx의 if를 악마라고 부르는 이유를 살펴보자 1..

🔥 Projects 🔥

[Security] @WithSecurityContext를 이용해 커스텀 UserDetails SecurityContext Test 코드 작성하기

선요약 커스텀하게 UserDetails를 구현해서 사용중이라면, SecurityContext의 인증된 유저 관련 테스트를 진행할 때 @WithMockUser를 사용할 수 없다. 컨텍스트에 인증된 유저를 배치하는 여러 방법 중 이런 상황에서 편리하고, 아주 유연한 처리가 가능한 @WithSecurityContext를 이용해 테스트 코드를 작성하는 법을 소개해본다. 1. @WithMockUser 사용하기 보통 Spring Security의 Security Context에 로그인된 유저 정보를 이용한 테스트를 진행할 때, 간편하게 `@WithMockUser` 어노테이션을 이용할 수 있다. 내 프로젝트의 Authentication Helper 클래스는 아래와 같이 현재 로그인한 유저를 Security Conte..

✏️ Study ✏️

Git과 Github 이해하고 사용하기 (입문 가이드 + 강의 영상)

안녕하십니까 GDSC Hongik 웹 기초 스터디 강사를 맡은 이진호입니다. 이번 수업 진행 속도가 너무 빨랐다는 피드백이 많아, 강의 내용 글로 작성합니다. 실제 수업에서 1주차 서버와 리소스의 복습 내용을 제외한 수업 내용을 정리하였습니다. 글을 읽은 뒤엔 꼭 실습해봅시다! 실습 영상 링크와 수업 영상 링크는 최하단에 있습니다. 앞으로 더 나은 수업을 위해 노력하겠습니다. 감사합니다. 강의한 내용을 글로 옮겼기 때문에 글이 깁니다! 목차 1번 서문과 2, 3 번은 빠르게 넘어가거나 읽지 않으셔도 됩니다. 1. 들어가면서.. (깁니다. 안 읽으셔도 좋습니다.) 오늘 수업 주제는 "Git : The Information Manager from Hell" + Github 입니다. 제가 프로그래밍을 막 시작..

✏️ Study ✏️

[Git] Git file status lifecycle

오늘 수업에선 깃의 유래와 그 강력한 기능들, 그리고 기본 원리에 대해 다루었다. 나름 쉽게 알려주려 노력했으나, 어려움을 호소하는 학우분들이 많았다. 수업 이후 수강 학우분 께서 깃이 관리하는 파일의 라이프 사이클에 대해 자세한 질문을 주셨다. 수업 중 제대로 짚고 넘어가지 못한 부분에 대해 설명하겠다. 1. 추적하거나, 추적하지 않거나 위 그림은 깃이 관리하는 파일 상태의 라이프 사이클이다. 기본적으로 Git이 관리하는 파일의 상태는 두 가지 상태를 가진다. 1. 추적 하거나 2. 추적하지 않거나 (tracked, untrackted) 수업에서 언급했듯이 git은 파일의 변경 사항들을 기록해준다. 그런데 프로젝트 내에 모든 파일이 관리될 필요가 있을까? 저장소에 올리고 싶지 않은 비밀스런 파일이나 잠..

🌱 Java & Spring 🌱

Bucket4J 사용하는 법 자세히 알랴드림

Bucket4J Bucket4J는 쓰로틀링을 위한 라이브러리다. 짧은 순간 너무 많은 요청으로 서버에 심각한 부하가 발생하는 것을 막아주기 위한 쓰로틀링에 적합하다. 어플리케이션 레벨에서 요청 갯수 제한을 위한 쓰로틀링이 필요할 때, 자바 라이브러리인 Bucket4J를 활용하면 간단하게 적용할 수 있다. 요청의 최대 제한을 정해두고, 요청이 들어올 때마다 토큰을 하나씩 소비한다. 위 사진처럼 토큰을 모두 소비하면 요청을 막는 형태다. 작동 원리는 무엇일까? Bucket4J는 내부적으로 Token Bucket 알고리즘을 통해 입력이 들어오는 속도를 조절한다. 과자가 담겨있는 마법의 항아리가 있다고 생각해보자. 마법의 항아리는 총 10개의 과자를 담을 수 있고, 10개 보다 작은 갯수의 과자가 남게 되면 1..

🌱 Java & Spring 🌱

[Spring] Template Callback Pattern in Spring

Template Callback Pattern in Spring 템플릿 콜백 패턴은 전략을 익명 내부 클래스로 구현한 전략패턴이다. 템플릿 콜백 패턴은 전략 패턴의 변형으로, 스프링 3대 프로그래밍 모델 중 하나인 DI에서 사용하는 특별한 형태의 전략 패턴이다. 템플릿 콜백 패턴과 전략 패턴은 전략을 익명 내부 클래스를 사용하는 점이 다르다. 결합도가 조금 증가하지만, 전략마다 팩토리 객체를 일일이 만들 필요가 없다. 유연하게 내부 구현체만 바꿔주면 로직 가능하다. 외부에서 어떤 전략을 사용하는지 감추고, 중요한 부분에만 집중할 수 있습니다. 스프링은 Template Callback Pattern을 DI에 적극 활용하고 있기 때문에, 스프링을 제대로 이해하고 활용하려면, 전략 패턴과 템플릿 콜백 패턴을 ..

🔥 Projects 🔥

[AWS] 하나의 EC2 인스턴스에 client, server 프로젝트 전부 배포하기! - React + Spring boot

[AWS] 한 EC2 인스턴스에 frontend, backend 전부 배포하기! - React + Spring boot 오늘은 하나의 EC2 인스턴스에 2개의 프로젝트를 배포하는 법에 대해 설명하겠습니다. 저도 EC2에 프로젝트를 배포하는 방법을 공부하기 위해 검색을 하고, 책까지 구매하여 공부하였으나, 두 프로젝트를 하나의 인스턴스에 넣고 배포하는 법에 대한 자세한 정보를 얻기는 어려웠습니다. (보통은 한 가지 프로젝트를 올리는 방법만 적혀 있습니다 ㅠ.ㅠ) 그래서 여기 저기서 정보들을 얻고 취합하고.. EC2에 배포한다는 것의 실제적인 의미를 파악하는 과정들을 통해 성공할 수 있었습니다. 기본적으로 EC2 인스턴스를 만든 후, putty를 통해 접속한 상황이라고 가정하겠습니다.(windows) 만드는..

진호우!
'분류 전체보기' 카테고리의 글 목록