본문 바로가기

전체 글

(1) Redis란 ? Redis Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of .. 더보기
(2) 스프링 비동기 처리를 위한 ThreadPoolTaskExecutor와 테스트 스프링에서 @EnableAsync 어노테이션과 비동기로 동작하기 바라는 메서드에 @Async 어노테이션을 사용해주면, 그 함수는 비동기로 작동할 수 있다. 이전 글에서 비동기 처리를 위한 TaskExecutor를 설정해주지 않으면 SimpleAsyncTaskExecutor가 사용된다고 했는데, 과연 그럴까 ? 그리고 많은 요청이 들어왔을 때 스레드 풀이 어떻게 동작하는지 테스트해보자. ThreadPoolTaskExecutor 옵션 Core Pool Size : 항상 유지할 최소 스레드의 개수 Max Pool Size : 스레드 풀이 가질 수 있는 최대 스레드의 개수, (Core Pool Size + 큐의 용량)보다 많은 요청이 들어오면 새로운 스레드를 생성하고 Max Pool Size보다 큰 개수의 스레.. 더보기
(1) 스프링 비동기 메일 전송, Sync vs Async, Blocking vs Non-Blocking 프로젝트에서 회원가입할 때와 비밀번호를 찾을 때, JavaMailSender를 사용해 메일 인증을 하고 있다. 그런데 메일 인증을 위해 인증번호 받기 API를 요청하면, 평균적으로 응답시간이 3초 이상 걸린다. 이를 개선하기 위해 서버에서 메일 전송을 비동기로 처리하고자 한다. 동기 동기는 작업을 순서대로 처리하는 것으로, 작업을 처리하며 그 작업의 완료 여부를 따진다. 또한 자바에서 한 함수를 호출하면 그 함수는 하나의 스레드가 모두 처리한다. 즉 함수 A가 실행 중에 함수 B를 호출하면, 함수 A를 처리하는 스레드가 함수 B를 처리 후 다음 코드를 실행한다. public class Main { public static void main(String[] args) throws InterruptedExc.. 더보기
스프링 JPA 테스트 코드에 무심코 적용한 @Transactional 스프링 프로젝트에서 많은 사람들이 JUnit으로 테스트 코드를 작성할 때, @Transactional 어노테이션을 사용한다. 하지만 Spring Data JPA와 함께 Service 테스트 클래스에 @Transactional을 무심코 사용한다면 예상하지 못한 테스트 실패나 누락이 발생할 수 있다. 문제 상황 1:N 연관 관계에 있는 엔티티들을 fetch join으로 잘 조회되는지 테스트하고자 했다. @Entity public class Board extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "board_id") private Long boardId; @ManyToOne(fetch = F.. 더보기
스프링 시큐리티 + JWT 첫 프로젝트를 진행할 때 security와 JWT를 사용해서 인증 인가를 구현하려고 했는데, 온갖 클론 포스팅에 원하는 정보를 얻지 못해 지쳐 내가 직접 쓰는 글.스프링에서 시큐리티와 함께 JWT를 사용하려는 사람들에게 도움이 됐으면 좋겠다.1. JWT란 ? JWT는 Json Web Token의 약자로, 웹에서 클라이언트와 서버가 통신할 때 사용되는 JSON 형식의 토큰에 대한 표준 규격이며 인증에 필요한 정보들을 암호화시켜서 가지고 있다.사용자는 로그인으로 인증과정을 거친 후 받은 JWT를 헤더에 실어 보내고, 서버가 클라이언트를 식별하는 인가 과정에서 사용된다. JWT의 구조는 3가지로 나누어진다.XXXXXX.YYYYYY.ZZZZZZ헤더.내용.서명Header : JWT에서 사용할 타입과 해시 알고리즘.. 더보기
auto_increment index 꼭 필요한가 ? 의문점프로젝트를 진행하면서 게시글에는 해시태그를 넣을 수 있다.인스타그램처럼 내가 원하는 해시태그를 마음대로 넣을 수 있는 건 아니고 정해진 해시태그들을 선택할 수 있도록 했는데, 여기서 데이터베이스의 인덱스에 의문점을 가지게 됐다. 해시태그는 다음과 같이 사용된다.해시 태그를 이용해서 게시글을 검색(조회)할 때어떤 게시글에 달린 해시 태그를 조회할 때 (어떤 게시글을 조회하면, 그 게시글에 달린 해시 태그들도 같이 가져와야 함)게시글을 작성할 때 (게시글에 해시 태그를 넣음) 내가 궁금했던 것은 테이블의 클러스터 인덱스인 board_hashtag_id가 필요할까? 였다. 해시태그가 사용될 때의 쿼리는 다음과 같다.where hashtag_name = ?where board_id = ?insert ,,,.. 더보기
스프링 + 리액트 : https, nginx, Mixed Content 문제 상황 첫 프로젝트, 첫 배포였다. 개발 과정은 api를 만들고 ec2 서버에 올려 프론트가 서버에 올려둔 api를 호출해서 테스트하는 방식으로 개발했으며, ec2 서버 내에 Spring과 React를 각각 3000번 포트와 8080번 포트로 실행했다. 하지만 배포 과정은 쉽지 않았다. 서버로 들어오는 http 요청을 https로 바꿔주기 위해 서버에 nginx와 letsencrypt를 설치하고, 프록시 서버를 둬서 React로 들어오는 요청에 https를 적용시켜 주었다. 그리고 웹 페이지로 들어가서 요청을 해본 결과 Mixed Content 에러가 떴다. Mixed Content ? 최초 HTML이 안전한 HTTPS 연결을 통해 로드될 때 혼합 콘텐츠가 발생하지만 다른 리소스(예: 이미지, 동영상.. 더보기
자바 Class 클래스 - Do it! 자바프로그래밍기초 여러 클래스 중 상황에 따라 다른 클래스를 사용해야 할 때, 반환받는 클래스가 정확히 어떤 자료형인자 모를 때 등 모르는 클래스의 정보를 사용할 경우에 사용하는 것이 Class 클래스이다. Class 클래스를 선언하고 클래스 정보를 가져오는 방법은 3가지가 있다. 1. Object 클래스의 getClass() 메서드 사용하기 String s = new String(); Class c = s.getClass(); // getClass() 메서드의 반환형은 Class 2. 클래스 파일 이름을 Class 변수에 직접 대입하기 Class c = String.Class; 3. Class.forName("클래스이름") 메서드 사용하기 Class c = Class.forName("java.lang.String"); .. 더보기