본문 바로가기

전체 글87

springboot service 계층: 인터페이스와 여러 구현체로 구현(공통 메서드 분리) 들어가기 이 글은 개인적인 생각을 포함하여 작성한 글이다. 나는 프로젝트를 할 때 항상 service 계층에 class 하나로만 구현을 하였었다. 하지만 다른 사람들이 한 프로젝트에서는 service 명칭으로 된 interface와 serviceImpl 명칭으로 된 class 구현체로 구현되어 있었다. 이는 디자인 패턴 중 전략 패턴을 적용한 것이라고 할 수 있다. 이게 과연 의미가 있나 싶어서 지금까지 적용하지 않았었는데 마침 리펙토링을 하면서 한번 알아보고 적용해 보기로 하였다. 이 글에서는 impl을 쓰는 이유와 간단 적용, 인터페이스와 여러 구현체일 때 공통 메서드 처리 등을 다룰 예정이다. Service 계층에서 인터페이스와 구현체의 구분은 왜 생긴 것인가? 처음 인터넷에 'spring serv.. 2023. 7. 15.
Java Springboot AOP를 통한 로그 출력 및 파일화(메서드 이름을 활용) 이 글에서는 Springboot 프로젝트를 진행하면서 AOP를 통해 로그 출력을 하는 과정을 담았다. AOP에 대한 개념적인 부분은 별도의 참고 URL로 표기하였고 활용 위주로 작성하였다. 글을 작성하기 전 간단하게 AOP를 통해 로그 처리를 한 소감을 말하자면 정말 말도 안 되게 유용한 기능이라고 생각한다. 처음에는 그냥 메서드마다 로직 사이에 log.info를 추가하기만 하면 되는 것을 뭐 하러 코드까지 늘리면서 다른 AOP 클래스를 생성할까? 하고 의구심이 들었다. 하지만 구현해놓고 수정할 일이 있어 메서드를 수정할 때 log출력에 관한 부분은 하나도 신경을 쓰지 않고 메인 로직을 수정할 수 있었다. 이게 AOP를 사용하는 진정한 장점이라는 것을 깨달았다. 다음 프로젝트에서도 계속 AOP를 통해 로.. 2023. 7. 8.
springboot delete시 DB접근, 쿼리 횟수에 대한 고찰(mybatis, jpa) 이 글은 프로젝트를 진행하면서 delete를 진행 시 mybatis 및 jpa를 사용하였을 때 DB에 접근하는 횟수 및 쿼리 횟수에 대해 비교하여 주관적으로 작성한 글이다. Article 테이블이 DB에 저장되어 있다고 하자. 여기서 Ariticle 하나를 delete 하려고 한다. jpa는 영속성 컨테스트라는 1차 캐시를 가지고 있다. 그렇기에 트랜젝션 안에서 select를 통해 Article 테이블 정보를 객체로 가져오면은 이에 해당하는 정보가 영속성 컨테스트에 저장된다. 그리고 delete를 실행하면 쿼리를 따로 저장해 놓았다가 트랜젝션 종료 시 저장해 놓은 쿼리를 DB에서 전달하여 실행하게 된다. 즉, article를 select하기 위해 DB접근 1회, 쿼리 실행 1회, 트랜젝션이 종료되면 쿼리.. 2023. 6. 24.
mybatis - ResultMap Collection을 통해 데이터 한번에 가져오기 프로젝트를 진행하던 중 member의 정보와 member가 작성한 article의 리스트, member가 속해 있는 group의 리스트를 가져와야 하는 기능을 구현해야 했다. member와 article와 group는 각각 테이블이고 member와 article는 일대다 관계, member와 group는 다대다 관계이며 중간에 member_group이라는 연결 테이블이 존재한다. member 정보 따로, article 리스트 따로, group 리스트 따로 구현하면 3번의 db접근이 일어난다. 그리고 설계를 잘못하면 N+1문제가 발생할 수 있다. 나는 이를 1번의 DB접근으로 표현하고 싶다. JPA에서는 fetch join 혹은 eager 한 방식으로 데이터를 가져오거나 배치사이즈를 조정하여 문제를 해결할.. 2023. 6. 18.
HTTP 버전의 변화(HTTP/1.0, HTTP/1.1, HTTP/2.0, HTTPS, HTTP3.0) HTTP는 Hyper Text Transfer Protocol의 약자로, 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 프로토콜은 인터넷끼리 통신을 하기 위해 정해 놓은 규칙으로 모든 통신은 규칙 즉, 프로토콜에 의존한다. HTTP는 웹서비스 통신을 할 때, 웹페이지를 들어갈 때 사용하는 프로토콜이다. 이러한 HTTP는 버전이 1.0부터 3까지 발전해 왔고 이러한 버전 변화를 이 글에 간단하게 작성해보려고 한다. 이 글은 '면접을 위한 CS 전공지식노트 - 주홍철'을 읽고 이를 바탕으로 간단하게 작성한 글이다. 들어가기 전 HTTP에 대해 잘 모른다면 https://khdscor.tistory.com/63를 참고하길 바란다. 1. HTTP/1.0 HTTP/1.0은 기본적으로 한 연결당 하나의 요청을.. 2023. 6. 15.
TCP/IP 계층 간단 정리 및 TCP 연결/해제 과정(3-way handshake, 4-way handshake) 들어가기 인터넷 프로토콜 스위트(internet protocol suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 프로토콜의 집합이며, 이를 TCP/IP 4 계층 모델로 설명하거나 OSI 7 계층 모델로 설명한다. 네트워크는 다수의 시스템을 전송 매체로 연결해 구성하 시스템들의 집합체이다. 네트워크들이 모여서 더 큰 네트워크로 확장할 수도 있다. 컴퓨터 네트워크는 물리적으로는 크게 호스트 시스템과 전송 매체로 구분한다고 할 수 있다. 서로 다른 호스트들이 전송 매체를 통해서 통신하는 것이 네트워크인 것이다. 하지만 호스트들마다 서로 다른 특징을 가질 거이다. 이런 호스트들을 연결해서 통신을 하려면 연결하는 방식을 표준화해야 한다. 국제 표준화 단체인 ISO(International St.. 2023. 6. 10.
네트워크 성능 분석 명령어 이 글은 네트워크의 기초 내용을 '면접을 위한 CS전공지식노트(주홍철)'과 '쉽게 배우는 데이터 통신과 네트워크(박기현)'을 읽고 공부한 내용을 간단하게 정리한 글이다. 애플리케이션 코드 상에는 문제가 없지만 서버로부터 데이터가 늦게 들어오거나 아예 들어오지 않는 경우가 있는데 이는 네트워크 병목 현상일 가능성이 있다. 병목(bottleneck) 현상은 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상을 말한다. 병의 몸통보다 병의 목 부분 내부 지름이 좁아서 물이 천천히 쏟아지는 것에 비유하여 bottleneck라는 이름이 붙었다. 서비스에서 이벤트를 열었을 때 트래픽이 많이 생기고 그 트래픽을 잘 관리하지 못하면 병목 현상이 생겨 사용자는 웹 사이트로 들어가지 못한다. 이때는 .. 2023. 6. 4.
개발 - 디자인 패턴 이 글은 '면접을 위한 CS 전공지식 노트 - 주홍철'을 읽고 부하고 정리한 내용을 작성한 글이다. 디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 많들어 놓은 것을 의미한다. 여기서 설명할 디자인 패턴들은 아래와 같다. 싱들톤 패턴 팩토리 패턴 전략 패턴 옵저버 패턴 프록시 패턴 이터레이터 패턴 노출모듈 패턴 MVC 패턴 1. 싱글톤 패턴(singleton pattern) 싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 클래스는 큰 틀의 형태로 이 틀을 기반으로 알맹이를 채워 넣는 실체가 인스턴스이다. 인스턴스는 여러 가지 만들 수 있지만 싱글톤 패턴은 오직 하나의 인스턴스만을 만들어 이를 기반.. 2023. 5. 23.
Gradle, 도커(docker)를 통한 springboot3 with mysql 배포(docker-compose) build.gradle 에 도커 관련 추가 부분 plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' id 'com.palantir.docker' version '0.35.0' } ... docker { println(tasks.bootJar.outputs.files) name rootProject.name + ":" + version dockerfile file('Dockerfile') files tasks.bootJar.outputs.files buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singl.. 2023. 5. 7.