일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스프링
- 동시성 문제
- Varchar
- 데이터 타입
- Lock
- CAS
- 가비지 컬렉터
- Di
- MVCC
- 가비지 컬렉션
- iterable
- 백엔드
- MySQL
- gc
- Atomic Type
- Synchronized
- jpa
- reflection
- Locking Read
- 동시성
- text
- 자바
- db
- iterator
- foreach
- java
- Today
- Total
목록Spring (27)
과정을 즐기자
싱글톤이란 클래스의 인스턴스를 하나만 생성하는 것을 말합니다. 스프링 컨테이너가 관리하는 스프링 빈들은 기본적으로 싱글톤으로 관리됩니다. 이번 글에서는 스프링에서 객체를 싱글톤으로 등록하는 방법, 싱글톤으로 관리하는 이유, 싱글톤 사용시 주의할 점,싱글톤을 직접 만드는 것의 단점과 스프링이 관리해주는 이유에 대해 알아보겠습니다. 📕 싱글톤으로 등록하는 방법스프링 프레임워크를 사용하다보면 크게 2가지 방법으로 스프링 빈을 등록합니다.등록하는 방법부터 간단하게 살펴 보겠습니다. 1. @Component 어노테이션 기반@Component, @Controller, @Service, @Repository와 같은 어노테이션으로 등록하고 가장 많이 사용하는 방법입니다. @Component의 메타 어노테이션 중에서 ..
Spring을 사용하여 개발을 하다보면 공통 로직에 대한 처리에 대해 개발자가 구현하기 쉽도록 해놓은 것을 알 수 있습니다. 예를들면 AOP, Filter, Interceptor, ArgumentResolver 등이 있습니다. 이번 글에서는 로그인 인증과 관련된 부분에 대해 위와 같은 기술 중에서 어떤 것이 적합한 지 생각해보며 어떻게 처리를 할 지에 대해 작성해보겠습니다. AOP AOP는 Aspect Oriented Programming의 약자로 횡단에 걸쳐 계속 반복하여 사용하는 코드의 중복을 줄일 수 있는 좋은 방법입니다. 로그인 인증과 관련된 부분도 AOP로 충분히 처리가 가능합니다. 하지만 AOP는 굉장히 범용적입니다. 컨트롤러는 파라미터나 리턴 값이 일정하지 않고 HttpServletReque..
Spring은 기본적으로 멀티 쓰레드, 동기 방식으로 작동합니다. 하지만 성능 향상을 위해서 비동기 방식으로 작동을 하도록 할 수 있습니다. 이번 글에서는 싱글 쓰레드/멀티 쓰레드, 동기/비동기에 대한 설명과 함께 Spring에서 멀티 쓰레드비동기 프로그래밍을 해보겠습니다.Java의 쓰레드 모델먼저 자바의 쓰레드에 대해 알아보겠습니다. 쓰레드의 종류에는 여러가지가 있지만 주요 쓰레드로는 OS 쓰레드, 유저 쓰레드가 있습니다. OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드입니다. 즉, CPU에서 실제로 실행되는 단위를 말하며 CPU의 스케줄링의 단위가 됩니다. 사용자의 코드, 커널 코드 모두 OS 쓰레드에서 실행된다고 볼 수 있습니다. 유저 쓰레드는 쓰레드의 개념을 프로그래밍 레벨에서 추상화 ..
바이너리 데이터는 컴퓨터가 이해하기 쉬운 형식의 데이터로 일련의 0과 1로 표현됩니다.이러한 바이너리 데이터는 텍스트 데이터에 비해 효율적으로 저장되며 데이터를 더 빠르게 전송할 수 있습니다.기계가 읽을 수 있는 언어이기 때문에 빠른 처리가 가능하고 오류가 발생할 가능성이 적어집니다.이러한 바이너리 데이터로는 이미지(JPEG), 오디오(MP3), 동영상(MP4) 등이 있습니다.이번 글에서는 이러한 바이너리 데이터를 처리하는 방법에 대해 작성해보려고 합니다.인코딩 방식바이너리 데이터를 처리하는 방법 중 하나로 Base64를 사용하는 인코딩 방식이 있습니다.Base64는 바이너리 데이터를 아스키 코드 일부와 일대일로 매칭되는 문자열로 단순 치환하는 인코딩 방식입니다.즉, Base64를 사용하여 바이너리 데이..
현재 가장 많이 사용되는 백엔드 기술 스택으로 Spring과 Node.js가 있습니다. Spring은 Java, kotlin과 같은 JVM 계열의 언어를 사용하고 사용하는 언어에 따라 Java Spring, kotlin Spring이라고 부릅니다. Node.js는 기본적으로 javascript을 사용하지만 타입이 없다는 단점이 있어 현재는 TypeScript를 주로 사용합니다. 이번 글에서는 2가지 기술 스택을 비교해보며 각각 어떤 장단점이 있으며 어떠한 경우에 사용하면 좋을 지 알아보겠습니다. 동작방식 기본적으로 Spring은 멀티 쓰레드 동기 방식으로 작동합니다. 아래 그림과 함께 더 자세히 알아보겠습니다. 예를들어 동시에 10개의 사용자 요청이 왔다고 하면 쓰레드 풀에서 10개의 쓰레드를 꺼내어 각..
지금까지 톱 레벨 클래스에 @Controller, @Service, @Repository, @Component를 붙여 스프링 빈으로 등록하였습니다. 등록을 하면 스프링 컨테이너 안에서 기본적으로 싱글톤으로 관리됩니다. 이때 내부 클래스도 스프링 빈으로 등록할 수 있는 지 궁금증이 생겨 예제, 학습 테스트를 만들어봤습니다. 중첩 클래스는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스 4가지로 나뉩니다. 여기서 정적 멤버 클래스를 제외한 나머지 클래스 들을 내부 클래스라고 부릅니다. Hello 라는 톱 레벨 클래스 안에 4가지 중첩 클래스를 만들어보았습니다. // 톱 레벨 클래스 @Component public class Hello { // 정적 멤버 클래스 @Component stat..
현재 '원하는 분야의 CS 면접 질문을 매일 아침 이메일로 전송해주는 서비스'를 운영하고 있습니다. 매일 아침 9시에 각 회원이 선택한 분야, 문제 수를 보내주는데 회원이 10명이 조금 넘을 때 30초가 넘게 걸렸습니다. 이렇게 오래걸린 이유는 이메일을 보내는 작업은 시간이 많이 드는 작업이기도 하지만 회원의 요청을 순차적으로 처리했기 때문입니다. 이번 글에서는 이메일을 보내는 작업을 비동기로 처리하여 30초가 넘게 걸리는 작업을 7.4초 정도로 줄인 과정 에 대해 작성해보려고 합니다. Before SendRandomQuizzes public void sendRandomQuizzes() { List quizFilterSearchList = quizFilterRepository.findAllQuizFilt..
프로젝트를 하다보면 파일(이미지, 동영상)을 업로드/다운로드 하는 경우가 있습니다. 한번 정리해보면 좋을 것 같아서 예시를 만들어봤습니다. 예시와 함께 이미지, 동영상을 저장하고 반환하는 방법에 대해 정리해보겠습니다. 파일을 HTTP를 이용해서 주고받을 때 Content-Type은 multipart/form-data 입니다. 이때 크게 2가지 방식을 사용할 수 있습니다. 첫 번째는 transferTo() 메소드를 사용하여 전체 파일 내용을 메모리에 로드한 후에 디스크로 복사하는 방식입니다. 두 번째는 Files.copy() 메소드를 사용하여 파일을 작은 조각씩 읽어서 복사하는 방식입니다. 첫 번째 방식부터 살펴보겠습니다. 첫 번째 방식 - 전체 파일 내용을 메모리에 로드 1개의 파일을 서버에 업로드 Fi..
해결하고싶은 문제 현재 CS 면접 질문 리스트를 이메일로 전송해주는 서비스를 만들고 있습니다. 특정 시간이 되면 가입된 회원이 원하는 분야의 문제를 원하는 문제 수만큼 보내줍니다. 이때 DB에 저장되어있는 퀴즈는 실시간으로 변경되는 데이터가 아닙니다. 따라서 매번 DB에서 퀴즈 데이터를 가져오는 것은 비효율적이라는 생각이 들었습니다. 로컬 캐시를 이용해서 이러한 성능 문제를 개선해보겠습니다. 도메인 이해 테이블이 어떻게 설계되었는지 살펴보겠습니다. 각 회원은 Quiz_Filter와 OneToOne 관계를 맺고 있습니다. 특정 시간이 되면 모든 회원에게 num_of_problem의 수만큼 분야가 true인 분야의 문제만 퀴즈 테이블에서 찾아서 이메일로 전송해줍니다. Before 개선하기 전 로직에 대해 살..
해결하고 싶은 문제 회원가입, 비밀번호 찾기 등의 기능이 있을 때 '회원을 어떻게 인증할 것인가'하는 문제가 있었습니다. 이를 해결하기위한 방법으로 회원 이메일로 인증번호를 전송하면 회원이 받은 인증번호를 입력한 후 일치하는지 확인한 후 기능을 제공하는 방법으로 해결하려고 했습니다. 해결과정 스프링부트 3.0.5 버전을 사용했습니다. build.gradle에 다음과 같은 설정정보를 추가합니다. implementation 'org.springframework.boot:spring-boot-starter-mail'application.yml에 다음과 같은 정보를 작성합니다. gmail을 사용했습니다. spring: mail: host: smtp.gmail.com port: 587..