일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- MySQL
- 가비지 컬렉션
- CAS
- Atomic Type
- 데이터 타입
- java
- 백엔드
- 스프링
- Di
- Synchronized
- foreach
- 자바
- db
- Varchar
- reflection
- Lock
- gc
- Locking Read
- text
- 동시성
- 가비지 컬렉터
- iterator
- iterable
- 동시성 문제
- MVCC
- jpa
- Today
- Total
목록전체 글 (98)
과정을 즐기자

프로젝트를 하다보면 파일(이미지, 동영상)을 업로드/다운로드 하는 경우가 있습니다. 한번 정리해보면 좋을 것 같아서 예시를 만들어봤습니다. 예시와 함께 이미지, 동영상을 저장하고 반환하는 방법에 대해 정리해보겠습니다. 파일을 HTTP를 이용해서 주고받을 때 Content-Type은 multipart/form-data 입니다. 이때 크게 2가지 방식을 사용할 수 있습니다. 첫 번째는 transferTo() 메소드를 사용하여 전체 파일 내용을 메모리에 로드한 후에 디스크로 복사하는 방식입니다. 두 번째는 Files.copy() 메소드를 사용하여 파일을 작은 조각씩 읽어서 복사하는 방식입니다. 첫 번째 방식부터 살펴보겠습니다. 첫 번째 방식 - 전체 파일 내용을 메모리에 로드 1개의 파일을 서버에 업로드 Fi..

마주친 문제 예전에 했던 프로젝트(웹툰)에서 양방향 매핑을 사용하였습니다. 양방향 매핑을 사용하는 이유는 도메인 로직을 풀어낼 때 개발의 편의성이 크고 객체 지향적인 설계를 유지할 수 있기 때문입니다. 그래서 저도 양방향 매핑을 사용했지만 서로 순환 참조를 한다는 문제점이 있습니다. 이러한 점을 고려했을 때 어떠한 설계가 더 나은지 이야기 해보겠습니다. 양방향 매핑을 사용 먼저 양방향 매핑을 사용한 예시를 확인 해보겠습니다. 웹툰 서비스에서 작가(Author), 만화(Cartoon)가 OneToMany 양방향 매핑입니다. Author @Getter @NoArgsConstructor(access = PROTECTED) @Entity public class Author extends BaseTimeEntit..

마주친 문제 프로젝트를 진행하면서 서비스를 배포하기위해 클라우드 서비스인 AWS EC2를 사용하였습니다. 스크립트를 만들고 gradle build를 하는데... 배포 도중 멈춤현상이 발생하였습니다. 실행을 중지하려고 해도 잘 되지 않았습니다. 결국 EC2를 종료하고 다시 시작하기를 반복하였습니다. 검색을 해보다가 대여한 EC2가 프리 티어이기 때문에 RAM을 1GB만 사용해서 메모리 부족현상이라는 사실을 알게되었습니다. 가상 메모리 운영체제가 하는 대표적인 역할 중 하나가 메모리 관리입니다. 컴퓨터 내의 한정된 메모리를 효율적으로 사용해야 합니다. 가상 메모리는 메모리 관리 기법 중 하나로 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것..

해결하고싶은 문제 현재 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..

이 글은 토비의 스프링을 읽고 정리한 내용입니다. 트랜잭션 경계설정 애플리케이션 내에서 트랜잭션이 시작되고 끝나는 위치를 트랜잭션의 경계라고 부릅니다. JDBC의 트랜잭션은 하나의 Connection을 가져와 사용하다가 닫는 사이에서 일어납니다. 트랜잭션의 시작과 종료는 Connection 오브젝트를 통해 이뤄지기 때문입니다. 지금까지 사용한 템플릿 메소드 호출 한 번에 한 개의 DB 커넥션이 만들어지고 닫힙니다. 결국 JdbcTemplate의 메소드를 사용하는 UserDao는 각 메소드마다 하나씩의 독립적인 트랜잭션으로 실행될 수밖에 없습니다. 여러 개의 작업을 하나의 트랜잭션으로 묶어주려면 트랜잭션의 경계 설정 작업은 비지니스 로직을 처리하는 쪽에서 가져와야 합니다. 하지만 이때 크게 4가지의 문제 ..

이 글은 토비의 스프링을 읽고 작성한 글입니다. try { ... } catch (SQLException e){ } 위와 같은 코드의 문제점은 예외를 잡고는 아무것도 하지 않았다는 점입니다. 예외는 반드시 처리되어야 합니다. 예외를 처리할 때 반드시 지켜야 할 핵심 원칙은 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보되어야 한다는 것입니다. 예외를 처리하기 전에 우선 체크 예외와 언체크 예외에 대해서 알아야합니다. GitHub - 320Hwany/TIL Contribute to 320Hwany/TIL development by creating an account on GitHub. github.com 자세한 내용은 위 링크에 있지만 간단하게 요약하면 체크 ..

이 글은 토비의 스프링을 읽고 작성한 글입니다. DB 커넥션이라는 제한적인 리소스를 공유해 사용하는 서버에서 동작하는 JDBC 코드에는 반드시 지켜야 할 원칙이 있습니다. 바로 예외처리입니다. 예외가 발생했을 경우에도 사용한 리소스를 반드시 반환해야 합니다. 이때 어디서 에러가 발생하느냐에 따라 반환해야 하는 리소스가 다릅니다. deleteAll() 메소드를 살펴보겠습니다. deleteAll() public void deleteAll() throws SQLException { Connection c = null; PreparedStatement ps = null; try { c = dataSource.getConnection(); ps = c.prepareStatement("delete from user..

이 글은 토비의 스프링을 읽고 정리한 글입니다. 스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트입니다. 이번 글에서는 테스트에 대해서 정리해보려고 합니다. 먼저 테스트를 작성하는 이유를 킹뽀대님 블로그에서 발췌해서 가져왔습니다. '테스트는 우리가 작성한 코드가 주어진 요구사항을 해결할 수 있는지 회귀를 통하여 검증할 수 있도록 돕고, 주어진 요구사항을 테스트하므로 작성된 테스트가 문서로서 작동할 수 있으며, 의미 있는 단위의 테스트를 고민함으로써 좋은 디자인을 만드는 데에도 도움을 줍니다. 또한 테스트로 보호된 코드는 나와 동료들에게 코드의 변경을 거침없이 시도할 수 있도록 안정감과 자신감을 줍니다.' 그렇다면 좋은 테스트코드란 무엇일까요? 1. 테스트는 자동화되어야 하고 빠르게 실행할..

이 글은 토비의 스프링을 읽고 정리한 내용입니다. 스프링이 자바에서 가장 중요하게 가치를 두는 것은 객체지향 프로그래밍이 가능한 언어라는 점입니다. 스프링이 가장 관심을 많이 두는 대상은 오브젝트입니다. 스프링은 오브젝트를 어떻게 효과적으로 설계하고 구현하고, 사용하고, 이를 개선해나갈 것인가에 대한 명쾌한 기준을 마련해줍니다. 여러가지 관심사항을 가지고 있는 UserDao를 개선해나가는 과정을 통해 스프링에 대해서 알아보겠습니다. UserDao public void add(User user) throws ClassNotFoundException, SQLException { Class.forName("org.h2.Driver"); Connection c = DriverManager.getConnectio..