1) 스프링 부트 서버에 배포하기 (1) 개요 로컬 환경에서 사용하던 스프링 부트 서버를 실제 서버 환경에 배포해보자! 실무 환경에서는 대부분 윈도우 서버가 아니라 Linux 서버를 사용하고 있으므로 RedHat 계열의 Linux에 배포할 예정이다! 그리고 2021년도에 RedHat 계열의 CentOS가 EOL 되고 CentOS Stream으로 바뀌게 되면서 RHEL을 Fork하여 만든 Rocky Linux, Alma Linux, Oracle Linux 중에서 Oracle Linux를 사용할 것이다! 추가적으로 퍼블릭 클라우드에서 Oracle Cloud가 가장 프리티어 혜택이 좋기 때문에 Oracle Cloud 환경을 이용한다! (2) 기본 환경 Oracle Linux 8.6 x86 System (3) ..
1) 옵셔널 (Optional) (1) 개요 Optional is primarily intended for use as a method return type where there is a clear need to represent "no result" and where using null is likely to cause errors. A variable whose type is Optional should never itself be null. it should always point to an Optional instance. 위의 내용은 JDK 8 API Document에 주석으로 적혀있는 부분 중 일부를 발췌한 것으로, 의역하자면 Java Optional 클래스는 Java 8에서 추가된 클래스로 ..
1) Redis 설치 및 명령어 실습 (1) 기본 환경 Rocky Linux release 8.8 (Green Obsidian) x86 시스템 (2) Repository를 이용한 Redis 설치 [root@localhost ~]# dnf install –y redis [root@localhost ~]# systemctl enable redis [root@localhost ~]# systemctl restart redis 보통 Repository에는 최신 버전이 아닌 Stable 버전 위주로 업데이트되기 때문에 최신 버전을 사용하려면 소스 컴파일하여 설치해야 합니다. 직접 소스 컴파일하여 설치하는 과정이 고되기 때문에 Repo에 올라온 버전을 사용하겠습니다 ^^7 (3) Redis 설정 [root@loca..
1) NoSQL (1) NoSQL이란 Not Only SQL 혹은 Non-Relational Operational DataBase의 약자로 비관계형 데이터베이스를 지칭한다. 기존의 RDBMS와 같은 관계형 데이터 모델을 지양하며 대량의 분산된 비정형 데이터를 저장하고 조회하는데 특화된 데이터베이스로 스키마 없이 사용하거나 느슨한 스키마를 제공하는 저장소이다. → 주로 빅데이터, 분산 시스템 환경에서 대용량의 데이터를 처리하는데 적합하다. 즉, 기존의 RDBMS가 Consistency와 Availability에 중점을 두었다면 NoSQL은 Scalability와 Availability에 중점을 두고 있는 것이다. (2) NoSQL의 특징 ① RDBMS와 달리 데이터 간의 관계 (Relation)를 정의하지..
1) Redis (Remote Dictionary Server) (1) 등장 배경 보통 서비스 규모가 커지면서 필연적으로 발생하게 되는 과도한 DB 연결과 방대해지는 DB의 사이즈로 인해 발생하는 성능 저하를 극복하기 위해 캐시를 사용한다. 캐시는 휘발성 데이터로 용량이 크진 않지만 데이터를 읽고 쓰는 속도가 굉장히 빠르므로 자주 요청되는 데이터만을 저장하여 활용한다. 파레토의 법칙에 따르면 전체 요청의 80%는 고작 20%의 사용자에 의해 발생하게 되는데 대부분의 요청은 적은 수의 사용자에 의해 발생하는 비슷한 요청일 것이다. 따라서, 이러한 요청 데이터들을 캐시로 저장하여 빠르게 읽고 쓸 수 있다면 좋은 성능의 애플리케이션을 제공할 수 있게 된다. 이러한 이유로 고가용성 In-Memory 데이터베이스..
1) 비관적 락 (Pessimistic Lock)을 이용한 동시성 이슈 해결 (1) 개요 이전 게시글에서 Synchronized 키워드를 이용하여 동시성 이슈를 해결하였으나 실무 환경에서는 1대의 WAS만을 이용하지 않고 여러 대의 WAS 서버를 운용하기 때문에 Synchronized를 사용하지 않는다. 왜냐하면 Synchronized 키워드는 한 대의 WAS 서버에서만 동기화 할 수 있기 때문이다. 따라서, 여러 대의 WAS 서버에서 DB의 특정 데이터를 변경하는 경우, Race Condition 이 발생할 수 있다. 이처럼 Race Condition을 해결하기 위해 이번에는 MySQL에서 제공하는 Lock을 이용해 비관적 락으로 해결해보고자 한다. 이전 게시글의 "(2) 초기 설정" 부분부터 "(4)..
1) Synchrozied 키워드를 이용한 동시성 이슈 해결 (1) 개요 웹 애플리케이션 서버 (WAS) 에서는 HTTP 요청 당 User Thread를 만들기 때문에 1대의 WAS에서 단일 DB 로의 세션은 요청 개수만큼 사용한다. 따라서, 여러 DB 세션에서 특정 데이터를 변경하는 Race Condition 이 발생할 수 있다. 이처럼 Race Condition 을 해결하기 위해 Java에서 제공하는 Synchronized 키워드를 이용해 해결해보고자 한다. (2) 초기 설정 실습 환경 MySQL 8.0 JDK 11 (IntelliJ) Spring boot 2.7 Spring JDBC 5.3.29 application.properties 설정 spring.datasource.driver-class-n..
1) 커넥션 풀 (Connection Pool) (1) 커넥션 풀이란 JDBC API를 사용하여 데이터베이스와 연결하기 위해 Connection 객체를 생성하는 작업은 비용이 굉장히 많이 드는 작업 중 하나이다. Connection 객체를 생성하는 과정을 한 번 살펴보자! ① 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회한다. ② DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생) ③ DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다. ④ DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다. ⑤ DB는 커넥션 생성이 완료되었다는 응답을 보낸다. ⑥ DB 드라..