우아한 테크코스 6기 프리코스 2주 차는 자동차 경주였다. 이번에도 저번 숫자 야구 게임에 이어서 회고의 느낌으로 작성할 예정이다. 내가 했던 고민과 수정했던 부분에 대한 이유를 주로 작성할 것이다. 고민거리 미션 중에 시도 횟수만큼 반복을 하는데, 이때 이 시도 횟수를 어떻게 처리할지에 대한 고민을 했다. 정확히 말하자면 나는 시도 횟수는 양의 정수여야 한다고 판단했다. 그렇다면 이 값에 대한 검증이 존재해야 하는데 이를 어디서 진행할 것인가? 나는 총 3가지를 고민했다. 첫 번째는 InputValidator였다. 즉 inputView를 받자마자 이를 예외를 검증하는 것이다. 하지만 이는 단순히 시도 횟수만을 위한 검증이라는 생각이 들기도 하였고, InputValidator는 빈 값만 체크하도록 전체 ..
이번에 우아한 테크코스 6기 프리코스에서 숫자 야구 게임을 구현해 보았다. 공통 피드백도 나왔기에 회고의 느낌으로 작성할 예정이다. 평소에도 객체지향에 관심이 많았고, 이를 충분히 적용하려고 노력하였다. 하지만 역시 코드에 정답은 없기에 미션을 수행하면서도 많은 고민을 하였다. 우선 구현에 사용하도록 외부 라이브러리가 포함되어 있었다. 이를 분석하고, 사용하기 위해 클래스 내부를 뜯어보았다. 내부에서 ThreadLocalRandom를 사용하여 랜덤 값을 생성하는데, ThreadLocalRandom를 찾아보니 동시성 문제에도 성능 저하 없이 사용할 수 있다는 특징이 있었다. Console의 경우에는 scanner를 싱클톤으로 사용하여 효율적으로 리소스를 활용하는 모습이었다. 살아있는 문서 가장 처음 목표로..
개발일기(23.10.18) 이번 개발일기는 거의 2달 만에 작성하게 되었다. 그동안 나는 계속해서 공부하며 성장을 하였다. 또한 꾸준히 운동을 하며 규칙적인 일상을 살려고 하였다. 운동기록블로그에도 꾸준히 작성하고 있듯이 거의 매일 운동을 하고 있다. 확실히 하루종일 집에서 개발만 하는 것보다는 운동을 하기 위해서라도 잠깐 밖에 나가는 것이 좋다고 생각한다. 조금이라도 몸을 움직여야 머리도 더 잘 돌아가고, 그냥 하루가 재미있다. 가끔 가기 싫은 날이 있었음에도 블로깅을 해야 한다는 생각으로 운동을 간 적도 있었다. 어느덧 나의 생활패턴이고 동기부여도 되어주는 좋은 습관이 되었다. 그동안 알고리즘을 계속해서 꾸준히 풀었다. 알고리즘을 좋아해서 자연스럽게 풀게되었다. 그 결과 백준은 플레를 찍게 되었다. ..
프로젝트 성능개선, 안티패턴 개선을 하면서 한 가지 의문이 들었다. 우선 현재 로직을 간단하게 설명하자면, @JwtLogin이 붙여져 있는 곳은 HandlerMethodArgumentResolver를 구현하여 헤더의 정보를 읽어 로그인한 멤버의 정보를 넘기는 방식이다. 코드의 흐름은 아래와 같다. Controller @PostMapping public ResponseEntity create(@JwtLogin final Member member, @RequestBody @Valid final BoardRequest boardRequest) { Board board = boardService.create(boardRequest, member); return ResponseEntity.status(HttpSt..
디스크 읽기 방식 데이터베이스 성능 튜닝은 어떻게 디스크 IO를 줄이느냐가 관건일 때가 상당히 많다. 랜덤 IO, 순차 IO와 같은 디스크 읽기 방식을 먼저 알아보자. 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) SSD는 기존 하드 디스크 드라이브에서 데이터 저장용 플래터(원판)를 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 아주 빠르고, 전원이 공급되지 않아도 데이터가 삭제되지 않는다. SSD의 장점은 기존 하드 디스크 드라이브보다 랜덤 IO가 훨씬 빠르다는 것이다. 데이터베이스 서버에서 순차 IO 작업은 그다지 비중이 크지 않고, 랜덤 IO를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 SSD의 장점은 DBMS용 스토리지에 최적이다. 랜덤 I/O 와 순차 I/O..
트랜잭션 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나, 아무것도 적용되지 않아야 함을 보장해 주는 것 데이터의 정합성을 보장해 줌 MySQL에서의 트랜잭션 InnoDB스토리지엔진은 트랜잭션을 제공함. MEMORY와 MyISAM 스토리지 엔진은 트랜잭션을 제공하지 않음 이로 인해 MyISAM에서는 부분 업데이트(Partial Update)가 발생하고, 이러한 부분 업데이트 현상은 테이블 데이터의 정합성을 맞추는데 상당히 어려운 문제를 만듦 -> 데이터 클렌징 코드를 따로 작성해주어야 함 주의사항 트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋음 일반적으로 데이터베이스 커넥션은 개수가 제한적임 ..
페이징 최적화를 진행해 보았다. 페이징 최적화에는 크게 두 가지 방법이 있다. NoOffset과 커버링 인덱스를 사용하는 방법이 존재한다. 이번에 프로젝트에서 게시글과 댓글의 페이징 최적화를 진행하였는데, 이 글은 게시글에 관해서만 작성할 예정이다. 일반적인 페이징 쿼리 기존의 코드는 아래와 같았다. public interface BoardRepository extends JpaRepository { Page findAll(final Pageable pageable); } @Transactional(readOnly = true) public BoardAllResponse findAllBoards(final Pageable pageable) { Page sortedBoards = boardRepositor..
Jasypt를 이용하여 암호화에 관해 작성할 예정이다. chatUniv프로젝트는 gpt key, jwt token, db password 등등 외부에 노출되면 안 되는 정보가 많이 담겨있다. 따라서 암호화가 반드시 필요한 상황이었다. 이를 해결하기 위해 Jasypt를 사용하였다. Jasypt(Java Simplified Encryption)은 Java 언어로 개발된 간단한 암호화 및 복호화 기능을 제공하는 라이브러리이다. Jasypt는 다양한 암호화 알고리즘과 기술을 지원하여 데이터 보안을 향상하는 데 도움을 준다. 간단한 사용법: Jasypt는 개발자가 암호화와 복호화 작업을 쉽게 수행할 수 있도록 해준다. 다양한 암호화 알고리즘 지원: Jasypt는 대칭키 및 비대칭키 암호화 방식을 지원하고, AES..
이번에는 GPT를 적용하는 내용을 정리할 것이다. openAi를 호출하는 것이기에 큰 어려움은 없다. https://www.baeldung.com/spring-boot-chatgpt-api-openai Using OpenAI ChatGPT APIs in Spring Boot | Baeldung Learn how to use the API of OpenAI ChatGPT in Spring Boot applications. www.baeldung.com 위 내용을 참고하였다. 따라서 중복되는 내용은 생략하여 진행하겠다. Chat @Entity @Table(name = "CHAT") public class Chat extends BaseEntity { @Id @GeneratedValue(strategy = G..
https://javajoha.tistory.com/ 알고리즘이 재미있다 javajoha.tistory.com 알고리즘을 좋아해서 매일 꾸준히 풀다보니 좋은 문제가 있으면 문제도 공유하고 싶다는 생각이 크게 들었습니다. 아이디어도 공유하고, 이를 작성하는 것에 재미를 느끼다보니 알고리즘 관련 글이 너무 많아졌다고 생각하였습니다. 또한 이를 분리하는 것이 다른 글을 보기에도 편하다고 생각하였습니다. 따라서 오늘부터 알고리즘 문제풀이 관련 글은 위의 블로그에서 작성하기로 결정하였습니다.