본문 바로가기

오블완22

1장 : SQL 처리 과정과 I/O SQL을 튜닝하기 전에, 옵티마이저가 SQL을 어떻게 처리하는지, 서버 프로세스는 데이터를 어떻게 읽고 저장하는지 살펴보자.  | 구조적, 집합적, 선언적 질의 언어SQL은 Structured Query Language의 줄임말로, 구조적 질의 언어이다. SQL은 기본적으로 구조적이고, 집합적이고, 선언적인 질의언어이다. 원하는 결과집합을 구조적, 집합적으로 선언하지만, 결과집합을 만드는 과정은 절차적이다. 데이터베이스 내부에서는 이 선언적인 쿼리를 기반으로 데이터를 가져오는 과정을 절차적으로 처리한다.사용자가 입력한 쿼리를 분석(Parsing)하고,실행 계획을 최적화(Optimization)하며,데이터를 필터링(Filtering)하고 정렬(Sorting)하여 결과를 반환한다. 데이터베이스 내부에서 데이.. 2024. 11. 27.
Chapter 4. 자바가 확장한 객체 지향 객체 지향의 4대 특성을 넘어 자바가 객체 지향을 확장하기 위해 사용하는 키워드와 개념을 살펴보자.  | abstract추상 메서드와 추상 클래스에 대해서 알아보자. 추상 메서드 : 선언부는 있는데 구현부가 없는 메서드를 말한다. 추상 클래스 : 추상 메서드를 하나라도 갖고 있는 클래스를 말한다.  이들은 공통 동작을 정의하고 다형성을 제공하기 위한 중요한 도구이다. Animal을 상속 받은 동물들에게 sound()라는 메서드는 공통 동작이다. 만약, abstract를 사용하지 않으면 개발자가 soud가 아니라 다른 메서드 명으로 정의하거나 누락 시켰을 때 이를 인지하지 못하게 된다. 따라서, abstract 키워드를 사용해서 반드시 sound()라는 메서드를 구현하면서, 공통 동작을 정의할 수 있게 하.. 2024. 11. 26.
Chapter 3. 자바와 객체 지향 기존의 구조적 프로그래밍에서 가장 중요하게 여겨지는 것은 함수이다. 함수는 코드를 논리적 단위로 구분하고 분할해서 정복하다는 것이다. Divide & Conquer 전략이다. 함수는 논리적 단위의 블록이라고 할 수 있다.  객체 지향을 이해하기 위해서 다음의 사항을 살펴보자. 세상에 존재하는 모든 것은 사물인 객체이다. 각각의 사물은 고유하다.사물은 속성을 갖는다. 사물은 행위를 한다.  그리고 우리는 이러한 사물을 분류(class)해서 이해한다. 김연아(Object)는 사람이라는 분류(class)에 속한다. 김연아(Object)는 나이, 몸무게, 키와 같은 속성(property)를 가진다. 김연아(Object)는 먹다, 자다, 걷다와 같은 행위(method)를 가진다. 위를 통해서 알 수 있는 점은 객.. 2024. 11. 25.
Chapter 2. 자바와 절차적 / 구조적 프로그래밍 Java는 Write Once Run Anywhere 이라고 한다. Java로 작성된 프로그램이 한 번 작성되면 다양한 플랫폼에서 수정 없이 실행될 수 있다는 것이다. JDK, JRE, JVM에 대해서도 알아두면 좋다.   T자 메모리 구조Java를 더 잘 활용하기 위해서는 우선, Java가 어떤 방식으로 메모리를 사용하는지 알아야 한다.코드 실행 영역데이터 저장 영역 하나의 프로그램이 실행될 때는 위와 같이 코드 실행 영역과 데이터 저장 영역으로 나뉜다. (모든 프로그래밍 언어의 공통된 메모리 사용 방식이다.)  그리고 객체 지향 프로그램에서는 데이터 저장 영역을 다시 세 개의 영역으로 분할해서 사용한다. Static 영역 - 클래스들의 놀이터Stack 영역 - 메서드들의 놀이터Heap 영역 - 객체들.. 2024. 11. 24.
11/23 - TIL : Load Balancer와 API Gateway의 차이 Spring Cloud와 관련해서 공부를 하던 도중 Load Balancer와 API Gateway의 차이에 대해 알아보면 좋을 것 같아서 이에 대해 알아보고자 한다.  두 가지는 공통적으로 요청이 들어오면 분배하는 느낌이지만, 사실 차이점은 있다.  간단하게 요약을 해보자면, Load Balancer는 여러 서버 간의 트래픽을 균등하게 분산시켜 시스템의 안정성을 유지한다. 하지만, API 게이트웨이는 클라이언트의 요청을 적절한 내부 서비스로 라우팅을 하는 역할이다. Load Balancer우선 로드밸런서는 네트워크 트래픽을 여러 서버에 균등하게 분산시켜, 시스템의 부하를 관리한다. 이를 통해 서버 과부하를 방지하고, 서비스의 가용성과 성능을 향상시킨다.  로드 밸런서의 주요 기능은 다음과 같다. 트래픽.. 2024. 11. 23.
11/22 - TIL : 영속성 컨텍스트와 Transaction JPA를 공부하다보면 반드시 마주하게 되는 내용은 영속성 컨텍스트와 Transaction이다.  ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.그리고 JPA는 ORM의 표준 인터페이스이다.   JPA에서 중요한 개념으로 생각되는 영속성 컨텍스트에 대해 알아보자. 영속성 컨텍스트(Persistence Context)  영속성 컨텍스트는 엔티티의 상태를 관리하는 JPA의 핵심 개념으로, 특정 트랜잭션 범위 내에서 엔티티를 메모리에 저장하고 관리한다. 데이터베이스에서 조회되거나 저장된 엔티티 객체를 캐싱해두고, 동일한 엔티티에 대한 요청이 있을 때 데이터베이스를 다시 조회하지 않도록 최적화한다. 특징 :1차 캐시 : 동일한 영속성 컨텍스트 .. 2024. 11. 22.
11/21 - TIL : Spring Bean과 DIP, DI, Interface Spring에서 중요하다고 할 수 있는게 뭐가 있을까? 그것은.. Bean이다. Spring의 핵심 철학인 DI(Dependency Injection)과 IoC(Inversion of Control)의 중심에 있는 것이 Bean이다.  Bean이 무엇이길래?!  먼저, 의존 역전 원칙(DIP : Dependency Inversion Principle), Interface, DI에 대해 우선 알아보자. DIP (Dependency Inversion Principle)DIP는 의존 역전 원칙으로 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안되며, 둘 다 추상화(인터페이스)에 의존해야 한다는 것이다. 이는 추상화된 인터페이스를 통해 상호작용해야 한다는 것이다. 상위 모듈은 인터페이스에 의존 하위 모듈은 인.. 2024. 11. 21.
11/20 - TIL : Spring Cloud와 Load Balancer Spring Cloud는 Spring Framework 기반의 클라우드 네이티브 애플리케이션을 개발하기 위한 프로젝트이다. Spring Cloud는 분산 시스템에서 필요한 기능들을 추상화하여 제공하고 있으며, 마이크로서비스 아키텍처를 구현할 때 유용하게 사용된다.  주요 기능은 다음과 같다. 서비스 등록 및 디스커버리 마이크로서비스는 동적으로 확장되거나 축소되기 때문에 고정된 IP 대신 서비스 레지스트리를 통해 위치를 관리한다. 서비스 등록 : 서비스 인스턴스는 자신의 정보를 서비스 레지스트리에 등록한다. 서비스 디스커버리 : 다른 서비스가 필요한 서비스의 위치를 동적으로 조회한다. Spring Cloud에서의 구현 : Spring Cloud Netflix의 Eureka 사용 (Eureka Server .. 2024. 11. 20.
11/19 - TIL : Query DSL이 JPQL보다 보안이 우수하다? 오늘은 이제까지 진행한 개발물에 대한 미니 발표회가 있었던 날이다. 다른 팀의 발표를 듣던 도중 알아보면 좋을 만한 주제가 있었다. 다른 팀 중에 Query DSL에 대해 알아보던 중 JPQL보다 Query DSL의 보안이 좋아서 사용했다라는 말이 있었다. Query DSL이 SQL Injection에 안전하다라고 하셨다.  이제까지 나는 Query DSL을 동적 쿼리를 처리하기 위해 사용했었다. Query DSL이 Type Safety가 있어서 런타임 시점이 아닌 컴파일 시점에 오류를 잡아준다는 점을 알고 있었지만, 보안이 더 뛰어나다라는 점에 대해서는 잘 알지 못해서 이점에 대해 알아보고자 한다.   우선 Query DSL은 정적 타입을 사용해 SQL 같은 쿼리를 생성할 수 있도록 하는 오픈소스 프레.. 2024. 11. 19.
11/18 - TIL : 1차 프로젝트 마무리 오늘 1차 프로젝트인 주문 플랫폼 개발을 마무리하였다.  약 일주일 동안 [요구사항 파악] - [프로젝트 설계] - [개발] - [서비스 배포] 의 과정을 거쳤다. 프로젝트를 회고하면서 그래도 일주일이라는 시간 동안에 꽤 많은 것을 했다는 것을 알 수 있었고, 나는 이 프로젝트에서 어느 정도 기여를 했는가에 대해 많이 생각해볼 수 있었다. (그래도 나름 많이 했다고 생각!)Query DSL 적용, Cursor 기반 페이징, 단위 테스트 및 통합 테스트 작성, 클라우드 서비스 배포... 등등  오랜만에 프로젝트를 진행하며 팀원들과 의견을 주고 받으면서 다른 분들의 코드를 보면서 코드 리뷰도 하며 내 개발 습관과 프로젝트 설계방식을 돌아보게되었다.  무엇보다도 가장 좋았던 것은 다른 사람들과 의견 공유를 하.. 2024. 11. 18.
11/17 - TIL : Builder 패턴 개발을 하다가 생성자를 오버로딩하는 방식으로 생성을 하게 되는 경우가 많았다. 하지만, 이런 경우 생성자를 여러 개 생성하게 되면 매번 생성자의 파라미터들을 확인해야 하는 번거로움이 있어 다른 생성은 어떤지 알아보고자 한다.   객체를 생성하는 방법에는 여러가지가 있다. 그리고 그 중 하나가 빌더 패턴이다.  빌더 패턴이 뭘까? 빌더 패턴에 대해서 알아보자.  Builder 패턴 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식 유연하게 다양한 타입의 인스턴스를 생성할 수 있다. (선택적 매개변수가 많은 상황에서 사용) 위처럼 유연하게 다양한 타입의 인스턴스.. 2024. 11. 17.
11/16 - TIL : 좋은 테스트 코드 상품 관련 API와 리뷰 관련 API의 테스트 코드를 작성하며, 테스트 코드를 작성하는 이유와 좋은 테스트 코드란 무엇인지에 대해 고민하게 되었다. 🧐 테스트 코드 왜 작성할까? 디버깅 비용 절감(문제가 되는 코드를 빠르게 파악하여 수정 가능하다.)회귀 버그(이전에 제대로 동작하던 기능에 문제가 생김)에 대한 관리와 대처 코드에 대한 이해 (담당 개발자뿐만 아니라, 동료들의 이해를 도울 수 있다.)좋은 코드인지에 대한 고민과 검증 (좋은 코드는 테스트하기도 좋다고 한다.) 내가 생각하는 테스트 코드를 작성하는 이유는 위의 이유라고 생각한다.  테스트 코드를 직접 작성하면서 특히 네 번째 이유에 깊이 공감하게 되었다. 테스트 코드를 작성하는 과정에서 내 코드의 결합도가 높은가? 유연하게 대응할 수 있는 .. 2024. 11. 16.