이번에 우아한 테크코스 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 알고리즘을 좋아해서 매일 꾸준히 풀다보니 좋은 문제가 있으면 문제도 공유하고 싶다는 생각이 크게 들었습니다. 아이디어도 공유하고, 이를 작성하는 것에 재미를 느끼다보니 알고리즘 관련 글이 너무 많아졌다고 생각하였습니다. 또한 이를 분리하는 것이 다른 글을 보기에도 편하다고 생각하였습니다. 따라서 오늘부터 알고리즘 문제풀이 관련 글은 위의 블로그에서 작성하기로 결정하였습니다.
개발일기(23.8.21) 개발일기를 오랜만에 작성하는 느낌이다. 7월 동안은 네이버 부스트캠프에 몰두하며 시간을 보냈다. 활동 카테고리에도 각 주차별로 정리하였었다. 챌린지이기에 과정기간 동안 어느 기준을 넘으면 멤버십에 참여할 수 있는 기회가 주어진다. 챌린지기간 동안 정말 많은 성장도 하였고, 평생 잊지 못할 경험을 하였다. 그 과정에서 나의 활동을 좋게 봐주셔서 멤버십이라는 좋은 기회를 주셨다. 하지만 오랜 고민 끝에 멤버십을 하지 않기로 결정하였다. 누군가는 하고 싶어도 못한다는 정말 좋은 기회임에 틀림없다. 나 역시도 이를 알기에 정말 고민을 많이 하였다. 선택의 기준은 내가 정말 하고 싶은 게 무엇일까에 초점을 두었다. 나는 서버개발자가 목표이기에 스프링을 계속해서 공부해 왔다. 4개월이라는 ..