[Java] 객체 지향 프로그래밍(OOP)의 4가지 특징과 원칙(SOLID)
·
Java
객체 지향 프로그래밍이란?현실 세계에서 어떤 제품을 만들 때 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 완성된 제품을 만들 듯이 소프트웨어를 개발할 때도 부품에 해당하는 객체를 만들고 이 객체를 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍(OOP: Object Oriented Programming)이라고 합니다. 즉 객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화시켜 속성과 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.객체 지향 프로그래밍의 장점1. 유지보수성이 좋다.    - 연관된 클래스만 코드를 변경하면 되며 절차지향에 비해 유지보수하기 편리합니다.2. 재사용성이 좋다.    - 만들어 둔 객체..
[Java] 자바 가상 머신(JVM)란 무엇인가?
·
Java
자바 가상 머신(JVM) 이란?JVM(Java Virtual Machine)은 자바 프로그램을 다양한 운영체제에서 실행할 수 있게 해주는 가상 머신입니다. 자바 프로그램은 기계어 대신 바이트코드라는 중간단계 코드로 변환되는데, 운영체제가 이를 직접 실행할 수 없기 때문에 바이트코드를 해석하고 실행하는 역할을 하는 것이 바로 JVM입니다. 또한 JVM은 Thread 관리 및 Garbage Collection과 같은 메모리 작업도 수행합니다. JVM은 특정 운영체제와 하드웨어 환경에 맞춘 기계어로 바이트코드를 변환하므로 운영체제에 종속적입니다. 따라서 자바 개발 키트(JDK)나 자바 런타임 환경(JRE)을 설치할 때 운영체제에 맞는 JVM이 함께 제공됩니다. JVM 구조 JVM은 다음과 같은 구성 요소로 이..
[Spring] 상속 구조와 Static Inner Class로 Dto 클래스 관리하기
·
Spring
들어가기 전에프로젝트를 진행하면 할 수록 쌓여만 가는 DTO 클래스를 보면서 관리의 필요성을 느끼게 되었다. 같은 도메인을 조회하더라도 API 마다 요구하는 데이터 필드가 다르기 때문에 불필요한 데이터 전송을 최소화하기 위해 API 마다 DTO 클래스를 생성하다 보니 유지보수하기 힘든 지경에까지 이르게 되었다. DTO 클래스 관리를 위한 리팩토링이 필요하다는 결론에 다달았고 상속 구조와 Static Inner 클래스를 사용하여 DTO 클래스를 관리했던 경험을 기록하고자 한다.상속 구조를 이용한 DTO 관리API 마다 데이터 구조가 다르다하더라도 공통적으로 조회하는 필드는 존재한다. 이 때 공통 필드를 모아놓은 DTO 클래스를 생성하고 새로운 API를 개발할 때 공통 DTO를 상속받아 새 DTO 클래스를..
[Spring] Spring AOP를 사용하여 사용자 권한 체크하기
·
Spring
들어가기 전에사이드 프로젝트로 진행했던 프로젝트에서 사용자 권한이 USER, COMPANY, INSTRUCTOR, ADMIN으로 나누어져 있었고 각 권한마다 접근이 가능한 API가 달라 권한 체크 로직이 필요한 상황이었다.  프로젝트 아키텍처는 MSA 구조였으며, Spring Cloud Gateway에서 JWT 토큰으로부터 사용자 PK와 권한 정보를 추출하여 각 마이크로서비스로 라우팅하고 있었다. 따라서, 해당 권한 정보를 기반으로 API 접근을 제한할 수 있을 것이라고 판단했다. Spring MVC 레벨에서 동작하며 컨트롤러 진입 전후에 특정 로직을 처리하는 Interceptor와 비즈니스 로직과 서브로직을 분리하여 횡단 관심사를 처리하는 AOP 중 고민했지만 특정 URI 경로에 대해 권한을 검사하는 ..
[Spring] 추상 팩토리 패턴을 사용하여 소셜 로그인 구현하기
·
Spring
들어가기 전에추상 팩토리 패턴이란??추상 팩토리 패턴(Abstract Factory Pattern)이란, 서로 관련된 객체들의 집합을 생성할 수 있는 인터페이스를 제공하면서 구체적인 클래스는 지정하지 않는 생성 패턴 중 하나이다. 즉, 클라이언트는 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 객체를 생성하고 사용하게 된다. 이 패턴을 사용하면 객체 생성 로직을 클라이언트 코드에서 분리하고, 다양한 구체적인 클래스들을 교체할 수 있는 유연성을 제공할 수 있다. 소셜 로그인을 구현할 때 Provider 마다 CLIENT_ID, REDIRECT_URI, CLIENT_SECRET이 다르고 사용자 정보도 다르게 넘어온다. if문으로 분기처리하여 구현할 수 있지만 추상 팩토리 패턴을 사용하면 서비스 코드에..
헥사고날 아키텍처(Hexagonal Architecture)
·
Spring
만들면서 배우는 클린 아키텍처라는 책을 읽고 정리한 내용입니다.헥사고날 아키텍처란?헥사고날 아키텍처란 알리스테어 콕번(Alistair Cockburn)이 만든 용어로 모듈 간 종속성을 외부에서 내부로만 향하게 하여 의존성을 역전시켜 객체 의존도를 낮추는데 목적을 둔 클린 아키텍처의 원칙들을 조금 더 구체적으로 정립한 개념이다.아래 그림이 헥사고날 아키텍처가 어떤 구조로 이루어져 있는지 보여주는 좋은 예시이다.  헥사고날 아키텍처는 어플리케이션 계층이 각 어댑터와 상호작용하기 위해 특정 포트를 제공하기 때문에 포트와 어댑터(ports-and-adapters) 아키텍처라고도 불린다.  위와 같은 패키지 구조를 가지고 있으며 어댑터, 어플리케이션, 도메인으로 나눈 뒤 각 패키지간에 통신할 때는 어플리케이션 ..
[DB] 인덱스 개념 및 원리
·
DB
인덱스란?인덱스의 개념을 설명할 때 가장 많이 드는 예시가 있다. 바로 책의 색인(Index)이다. 데이터베이스 공부를 하다가 RDBMS 개념이 궁금해 책을 찾아보고 있다고 가정해보자. 책을 첫 장부터 넘기면서 해당 내용을 찾을 수도 있지만 이는 매우 비효율적이다. 아마 대부분의 똑똑한 독자들은 책의 맨 뒤에 있는 색인 페이지에서 해당 개념이 포함되어 있는 페이지를 찾아 볼 것이다. 이처럼 책의 색인은 우리가 원하는 단어를 쉽고 빠르게 찾을 수 있게 도와준다. 이와 마찬가지로 데이터베이스에서 인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 쉽고 빠르게 찾을 수 있다. 여기까지만 보면 인덱스를 사용하는게 매우 효과적으로 보이지만 무조건 인덱스를 사용하는 것은 오히려 성능을 악화시킬 수 있다. 예를..
[Spring] Master, Slave 데이터베이스 구조로 쓰기, 읽기 연산 나누기
·
Spring
원티드에서 제공하는 프리온보딩 챌린지 과정을 수강하면서 데이터베이스 구조를 주 데이터베이스(Master DB)와 서브 데이터베이스(Slave DB)로 나눠 쓰기 연산(Insert, Update, Delete)과 읽기 연산(Find)을 분기 처리하는 방법을 알게 되어 정리한 글입니다.서론대부분의 애플리케이션은 쓰기 연산보다 읽기 연산의 비중이 훨씬 높다. 따라서 더 나은 성능을 위해 데이터베이스 상태를 변경하는 생성, 수정, 삭제는 주 데이터베이스(Master DB)에서 처리하고 읽기 연산은 서브 데이터베이스(Slave DB)에서 처리한다.  연산 종류에 따라 DB를 구분하는 방법은 @Transactional 어노테이션을 사용한다. @Transactional의 readOnly 속성이 true면 읽기 연산이..