본문 바로가기

Back-end109

지극히 개인적인 OOP에 대한 원초적인 접근과 해석 0. 개요 요즘 스터디에서 토비의 스프링을 읽고 있습니다. 책을 읽다보니 내가 그동안 짜던 코드는 OOP적인 코드가 아니라는 것을 깨달았습니다. 머리로는 "이해하고 있다"라는 착각을 하고 있던 것이죠. 그래서 근본적인 질문과 관점으로 다시한번 OOP에 대해 배워보려고 합니다. 1. OOP란 무엇인가? OOP는 객체지향 프로그래밍(Object Oriented Programming)의 약자입니다. 그렇다면 이 객체 지향이라는 것이 무엇일까 궁금증이 생깁니다. 객체지향이라는 것은 한 묶음의 소스코드를 객체라는 하나의 단위로 보는 것입니다. 그리고 이 객체 간의 상호작용을 통해서 하나의 프로그램이 돌아가게 되는 것이죠. 마치 전대물에 나오는... 수십가지 서로 다른 로보트가 합체해서 새로운 로보트가 되는 것과 .. 2023. 8. 6.
AOP(Aspect Oriented Programming) 개념과 구현 0. 개요 - 토비의 스프링 6장을 읽다보면 AOP에 대한 이야기가 나온다. - 해당 부분에서 Proxy가 왜 등장하는지, AOP와 proxy가 무슨 관계가 있는지 등 이해할 수 없는 부분이 너무 많았다. - 즉, 내가 AOP에 대해 모르고 있기에 이해할 수 없다는 것을 깨닫고 AOP에 대해서 정리해보기로 했다. - 나와 같이 AOP 기본개념에 대해 모르는 분들에게 도움이 되기를 바란다. 1. AOP와 Proxy의 상관관계 - AOP 이야기를 할때면 프록시 이야기가 빠지지 않고 나온다. - 왜 그럴까? AOP와 프록시가 무슨 관계가 있는 것일까? 아니 그보다 프록시란 정확하게 무엇인가? - 이에 대해서 이해해보자. a) Proxy가 뭔데? - 프록시는 어떤 역할을 대신 수행하는 대상을 가리킨다. - 네트.. 2023. 7. 24.
자바에서 람다를 사용하는 방법 0. 개요 - 자바에서 람다를 잘 써보고 싶은 마음에 본 포스팅을 준비했습니다. - 우선 람다를 이해하기 위해서는 기본적인 인터페이스에 대한 이해도가 필요합니다. - 인터페이스를 시작으로 람다에 대해 배워봅시다! 1. 인터페이스를 매개변수로 받는 메서드 - 인터페이스를 매개변수로 받으면 어떻게 될까? - 한번도 의식적으로 사용해 본 적도, 생각해 본 적도, 고민해 본 적도 없는 질문이다. - 다음 코드를 보자. 예시코드 public static void main(String[] args) { static void sound(PrintThing printThing) { printThing.print(); } } public interface PrintThing { void print(); } - 위의 코드.. 2023. 6. 26.
Optional이 뭔데? 왜 쓰는데? 1) Optional을 쓰는 이유 - 어떤 객체를 조회하여 객체 내부의 값을 가져오려고 할때 해당 값이 존재하지 않는다면 NullPointerException이 발생하는 것을 자주 마주칠 것이다. 아래의 코드처럼 말이다. 예시코드(문제 제기) public class OptionalExample{ public static void main(String[] args) { Friend myFriend = findByName("Kim"); System.out.println(myFriend.getAge()); } private static Friend findByName(String name){ Friend friend = friendRepository.findByName(name); return friend; .. 2023. 6. 23.
Query DSL이란? 0. 개요 - 이번 포스팅은 Query DSL에 대해서 간략하게 알아볼 예정이다. - JPA를 조금 더 효율적으로 사용하고 싶다면 Query DSL에 대해서 알아보자. http://querydsl.com/ 2022. 6. 8.
Spring Data JPA란? 0. 개요 - 이번 포스팅은 Spring Data JPA에 대해서 간략하게 알아볼 예정이다. - JPA를 조금 더 효율적으로 사용하고 싶다면 Spring Data JPA에 대해서 알아보자. https://spring.io/projects/spring-data-jpa Spring Data JPA Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered ap.. 2022. 6. 7.
OSIV(Open Session In View) 0. 개요 - 지금까지 JPA 기본 개념에 대해서 알아보았다. - 이번 포스팅은 JPA의 마지막 개념인 OSIV에 대해서 알아보자. 1. OSIV(Open Session In View) a) OSIV 란? - Open Session In View란, 하이버네이트 또는 JPA를 지칭하는 이름이다. - JPA는 Open Entity Manager In View이라 불리기도 하는데, 관례상 OSIV로 통일하여 부른다. b) OSIV 사용 설정 - JPA를 사용하면 Spring에서 기본적으로 spring.jpa.open-in-view의 옵션 값을 TRUE로 설정한다. - 이는 OSIV 옵션을 사용한다는 의미로, JPA 프로젝트 빌드 시점에 다음과 같은 warn 로그에서 확인할 수 있다. c) OSIV의 기능 -.. 2022. 6. 7.
API 조회 성능 최적화 - 컬렉션(DTO 직접 조회) 0. 개요 - 이번 포스팅에서는 DTO를 직접 사용하여 컬렉션을 조회하는 방식에 대해서 알아보자. 1. DTO 직접 조회 준비 a) DTO 직접 조회의 의미 - 단일 조회 시 DTO를 직접 사용한 조회 방법과 동일하게 컬렉션도 DTO를 사용하여 직접 조회할 수 있다. - DTO 직접 조회 방식의 핵심은 Entity를 전혀 사용하지 않고 오직 DTO만을 이용하여 데이터를 받아오는 것이다. - 즉, Entity를 조회하고 그 데이터를 이용하여 DTO를 생성 및 반환하는 작업이다. - 언뜻 보면 DTO 변환 방식과 특별한 차이점을 못 느낄 수도 있다. - 그러나 DTO 직접 조회 방식은 API 메서드에서 오직 DTO만을 사용한다는 것이 특징이다. b) 준비 작업 확인 - 우선 DTO 변환을 이용한 조회 메서드.. 2022. 6. 4.
API 조회 성능 최적화 - 컬렉션(Fetch Join + 페이징 + Batch Size) 0. 개요 - 이전 포스팅에서 Fetch Join을 사용하면 페이징을 사용할 수 없다는 것을 배웠다. - 그러나 개발을 하다 보면 Fetch Join과 페이징이 함께 필요한 경우가 발생할 것이다. - 이러한 상황에서 어떻게 페이징을 구현할 수 있는지 알아보자. 1. Fetch Join + 페이징 사용 불가 a) 근본적인 이유 - Fetch Join은 일대다(= OneToMany) 조인에서 사용된다. - 일대다(= OneToMany) Join의 목적은 일(= One)을 기준으로 Join 하는 것이다. - 그러나 DB는 다(= Many)를 기준으로 Join 하므로 결과 데이터가 다(= Many)의 개수만큼 생성된다. - 이처럼 결과 데이터의 증가로 인해, 데이터의 순서가 뒤틀리게 되어 페이징을 사용할 수 없.. 2022. 6. 3.