공지사항
블로그 공지
블로그 공지
공지
2024.12.31 22:03
추천 글
[Ubuntu] ssh 원격접속 보안 강화
[Ubuntu] ssh 원격접속 보안 강화
서버 구축기
2024.11.29 10:53
최근에 개인 서버를 마련했다. 이 서버에 내 개인 프로젝트를 구동시킬 예정인데, 보안이 신경쓰여 내가할 수 있는 방법을 최대한 써서 보안을 강화하려고 한다. 아래의 내용을 따라하면 다음과 같은 보안적인 이점이 있다.SSH 포트번호 변경root 계정 SSH 접속 비허용RSA를 이용한 공개키 기반 인증허용된 포트만 열어둠(UFW)비정상적인 접근 차단 및 로깅(fail2ban)SSH 2단계 인증(2FA) 서버 환경은 Ubuntu 24.04 LTS 버전에서 이뤄졌다는점 참고 바랍니다. SSH 포트번호 변경ssh 설정파일을 변경해서 포트번호를 바꾸어햔다.sudo nano /etc/ssh/sshd_configPort 부분에 주석이되어있을 텐데 주석을 해제하고 원하는 포트번호로 바꾼다. sudo nano /lib/s..
[DB 성능 최적화] 인덱스(Index)
[DB 성능 최적화] 인덱스(Index)
MySQL
2024.08.21 00:51
이 글은 인프런의 MySQL 성능 최적화 입문/실전 (SQL 튜닝편) (박재성) 강의를 듣고 개인적으로 정리하는 글임을 알립니다.MySQL 아키텍쳐MySQL의 아키텍처를 간단하게 표현하자면 위와 같다.클라이언트가 DB에 SQL 요청을 보낸다. MySQL 엔진에서 옵티마이저가 SQL문을 분석한 뒤 빠르고 효율적으로 데이터를 가져올 수 있는 계획을 세운다. 어떤 순서로 테이블에 접근할 지, 인덱스를 사용할 지, 어떤 인덱스를 사용할 지 등을 결정한다.(옵티마이저가 세운 계획은 완벽하지 않다. 따라서 SQL 튜닝이 필요하다.)옵티마이저가 세운 계획을 바탕으로 스토리지 엔진에서 데이터를 가져온다. (DB 성능에 문제가 생기는 대부분의 원인은 스토리지 엔진으로부터 데이터를 가져올 때 발생한다. 데이터를 찾기가 어..
[JPA] 병합(Merge)과 변경 감지(Dirty Checking)
[JPA] 병합(Merge)과 변경 감지(Dirty Checking)
JPA
2024.08.05 19:29
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.JPA(Java Persistence API)에서 변경 감지(Dirty Checking)와 병합(Merge)은 엔티티 상태 관리를 위한 중요한 개념이다. 이 두 가지는 데이터베이스와 애플리케이션 간의 동기화를 효율적으로 관리하는 데 사용된다. 결론부터 말하면 두 방법중에 변경 감지를 사용하는 것이 더 좋다. 병합병합(Merge)은 JPA에서 준영속 상태의 엔티티를 영속성 컨텍스트에 포함시키고, 해당 엔티티의 상태를 데이터베이스에 반영하는 작업이다.이 과정은 데이터베이스에 이미 저장된 데이터를 수정할 때 사용된다.@PostMapping(value = "/items/{itemId}/edit")public String..
[Linux] 프로세스와 시그널
[Linux] 프로세스와 시그널
Linux
2024.11.08 20:37
프로세스 계층구조리눅스의 프로세스 계층구조는 부모-자식 관계를 기반으로 형성되며, 트리 구조로 표현된다.  부모 자식 관계새로운 프로세스는 기존 프로세스가 fork()를 호출하여 생성한다.프로세스가 생성되면 부모 프로세스의 자식 프로세스로 연결된다.모든 사용자의 최상위(최초의) 프로세스는 init 또는 systemd이다. 프로세스 계층 구조 Process 0 (Idle Process)리눅스 시스템 부팅 시 커널이 가장 먼저 생성하는 프로세스로, 메모리 관리 및 시스템 초기화 같은 커널 수준의 작업을 담당한다.시스템 부팅 중 커널의 초기화를 수행.이후 사용자 영역의 첫 프로세스인 프로세스 1(init)을 생성.모든 초기화가 완료되면, Idle Process로 전환되어 CPU의 유휴 상태를 관리.PID 0이..
[Docker] Docker Compose를 이용한 SpringBoot + MySQL + Redis 컨테이너 동시에 띄우기
[Docker] Docker Compose를 이용한 SpringBoot + MySQL + Redis 컨테이너 동시에 띄우기
Docker
2024.08.26 00:47
주의사항Docker Hub의 최신버전 MySQL은 9.x 버전이다.그런데 현재 24.8.25일 기준 최신 스프링부트 버전인 3.3.3은 MySQL 9.x 버전을 지원하지 않는다.따라서 MySQL의 모든 버전은 8.0.32 버전으로 맞추었다. 스프링부트 설정build.gradledependencies {...implementation 'org.springframework.boot:spring-boot-starter-data-redis'implementation("org.springframework.boot:spring-boot-starter-data-jpa")implementation 'mysql:mysql-connector-java:8.0.32'}  application.propertiesspring.d..
[Github Actions] 기본 문법 + 스프링부트 프로젝트 배포 자동화
[Github Actions] 기본 문법 + 스프링부트 프로젝트 배포 자동화
CI & CD
2024.09.13 00:20
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.CI/CD는 Continuous Integration(지속적 통합)과 Continuous Deployment(지속적 배포) 또는 Continuous Delivery(지속적 전달)를 뜻한다.이 개념은 개발자가 더 효율적으로 코드를 작성하고, 빠르고 안정적으로 사용자에게 소프트웨어를 제공하는 것을 목표로 한다. GitHub Actions는 자동화된 워크플로우를 지원하는 도구로, 저장소의 빌드, 테스트, 배포 등의 작업을 자동화할 수 있다.즉, GitHub Actions는 CI/CD 과정에서 빌드, 테스트, 배포에 대한 로직을 실행시키는 서버(컴퓨터)의 역할을 한다.개발자가 코드를 작성 후 커밋 & 푸시를 하는 순간 Gi..
[Database] 트랜잭션 ACID, DB 연결구조와 세션
[Database] 트랜잭션 ACID, DB 연결구조와 세션
데이터베이스 이론
2024.02.27 00:59
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다. 트랜잭션의 기본적인 내용은 아래의 글을 참고 2023.08.20 - [Java Category/Java] - [Java] DB 트랜잭션 처리 [Java] DB 트랜잭션 처리 이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 트랜잭션 트랜잭션(transaction)은 기능 처리의 최소 단위를 말한다. 하 rebugs.tistory.com 트랜잭션 ACID ACID 속성 원자성(Atomicity): 트랜잭션 내의 모든 연산은 전부 완료되거나 전부 실행되지 않아야 한다는 원칙이다. 즉, 트랜잭션의 연산 중 하나라도 실패하면, 이미 실행된 모든 연..
[JAVA] 상속 - 타입 변환과 다형성
[JAVA] 상속 - 타입 변환과 다형성
Java
2023.01.08 00:17
본 게시글은 혼자 공부하는 자바 (저자 : 신용권)의 책과 유튜브 영상을 참고하였고, 개인적으로 정리하는 글임을 알립니다. 기본 타입(기본 자료형)의 타입 변환(형 변환)에는 자동 타입 변환이 있고, 강제 타입 변환이 있다. 클래스에도 이러한 타입 변환이 있다. 메소드 재정의(오버라이딩)와 타입 변환을 이용하면 객체 지향 프로그래밍의 매우 중요한 특징인 다형성을 구현할 수 있다. 다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질이다. 예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 장착하느냐에 따라 주행 성능이 달라질 수 있다. 어떤 타이어는 고속주행에 유리한 타이어이고, 또 다른 타이어는 눈길에서 미끄러지지 않고 주행할 수 있는 타이어가 ..
인기 글
[Java] File과 Files 클래스
[Java] File과 Files 클래스
Java
2023.08.10 00:42
이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. java.io 패키지와 java.nio.file 패키지는 파일과 디렉토리 정보를 가지고 있는 File과 Files 클래스를 제공한다. Files는 File을 개선한 클래스로, 좀 더 많은 기능을 가지고 있다. File 클래스 File 클래스로부터 File 객체를 생성하는 방법은 아래와 같다. File file = new File("경로"); 경로 구분자는 OS마다 조금씩 다르다. 윈도우에서는 \\ 또는 /를 둘 다 사용할 수 있고, 맥 OS 및 리눅스에서는 /를 사용한다. 아래는 윈도우에서 File 객체를 생성하는 코드이다. File temp = new File("C:/Temp/fil..
IntelliJ에서 Database(MySQL, Oracle) 연결하기
IntelliJ에서 Database(MySQL, Oracle) 연결하기
기타
2024.01.09 00:01
개발 환경 windows 11 pro jdk : 17.0.9 mysql : 8.0.35 oracle : 19.3.0 intelliJ : 2023.3.2 데이터베이스 연결하기 우측 상단의 톱니바퀴 모양을 클릭하고 Project Structure 클릭 Libraries - +버튼 - Java 클릭 JDBC가 있는 폴더에서 jar 파일 클릭 mySQL, Oracle 각각 JAR이 다르니 검색해서 버전에 맞는거 다운로드 하세요 프로젝트 선택후 ok 버튼 클릭 정상적으로 추가된 것을 확인했으면, ok 버튼이나 apply 버튼 클릭 이제 데이터베이스와 연결할 준비가 끝났다. 또 다른 방법 우측 끝에서 Database 아이콘 클릭 + 버튼 클릭 Data Source - 원하는 데이터 베이스 클릭 MySQL - MyS..
[Git] 소스트리(Sourcetree)로 브랜치(Branch) 다루기
[Git] 소스트리(Sourcetree)로 브랜치(Branch) 다루기
Git & GitHub
2023.12.27 00:11
본 게시글은 모두의 git,github(저자 : 강민철)의 내용을 개인적으로 정리하는 글입니다. 브랜치란? 브랜치는 마치 줄기에서 뻗어 나오는 나뭇가지와 같이 버전을 여러 흐름으로 나누어 관리하는 방법이다. 브랜치는 버전의 분기이다. 작업을 분기하고 싶을 때 브랜치를 나누면 된다. 버전을 나누어 관리하는 것은 아래의 3단계로 버전을 관리하는 것을 의미한다. 브랜치를 나눈다. 각자 브랜치에서 작업한다. (필요할 경우) 나눈 브랜치를 합친다. 브랜치 나누고, 합치기 깃이 제공하는 가장 기본적인, 최초의 브랜치를 master 브랜치라고 한다. 가령 로컬 저장소를 만들고, 커밋 세 개를 만들었다고 가정하자 이 커밋 모두는 master 브랜치에 속한다. master 브랜치에 만들어진 세 커밋을 master 1번 ..
[Spring MVC] 파일 업로드
[Spring MVC] 파일 업로드
Spring
2024.03.25 00:29
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다. 파일 업로드 일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다. HTML 폼 전송 방식 application/x-www-form-urlencoded multipart/form-data application/x-www-form-urlencoded 방식 application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다. Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다. →Content-Type: appl..
[Spring MVC] 스프링 타입 컨버터
[Spring MVC] 스프링 타입 컨버터
Spring
2024.03.24 00:15
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다. 스프링 타입 컨버터 스프링 프레임워크에서 타입 컨버터(Type Converter)는 한 타입의 객체를 다른 타입으로 변환할 때 사용되는 메커니즘이다. 스프링 MVC에서는 클라이언트로부터 받은 문자열 데이터를 컨트롤러의 파라미터나 필드에 지정된 타입의 객체로 변환할 필요가 자주 있다. 예를 들어, URL 경로에서 가져온 문자열을 날짜 객체나 열거형, 심지어는 사용자 정의 타입으로 변환해야 할 때가 그러하다. 이럴 때 스프링의 타입 컨버터 기능이 유용하게 사용된다. @GetMapping("/hello-v2") public String helloV2(@RequestParam Integer data) { System...
최신 글
[Java] BigInteger 클래스
Java2025.02.28 09:48[Java] BigInteger 클래스

BigInteger는 Java에서 기본적으로 제공하는 정수 타입(int, long)보다 더 큰 정수를 다룰 수 있도록 설계된 클래스이다.int는 32비트 정수(약 ±21억), long은 64비트 정수(약 ±9경)까지만 저장할 수 있지만, BigInteger는 이보다 훨씬 큰 정수(무한대)를 다룰 수 있다.생성문자열을 이용한 생성import java.math.BigInteger;public class Main { public static void main(String[] args) { BigInteger bigInt1 = new BigInteger("123456789012345678901234567890"); System.out.println(bigInt1); // 1234..

[Spring] GeoIP를 이용한 해외 IP 차단
Spring2025.01.16 21:24[Spring] GeoIP를 이용한 해외 IP 차단

MaxMind 에서 데이터베이스 다운로드MaxMind에서 먼저 데이터베이스를 받아와야한다.국가를 제외한 나머지 자료(시, 도 등)는 꽤 부정확하다는 글이 많고, 해외인지 아닌지가 가장 중요하기 때문에 country 데이터베이스만 사용하기로 했다.아래 사이트에서 회원 가입을 한 후 country 데이터베이스를 다운로드 받는다.(GeoLite2-Country.mmdb)https://www.maxmind.com/en/home 스프링에 적용의존성 추가build.gradle에 geoip 의존성을 추가해준다.implementation "com.maxmind.geoip2:geoip2:4.1.0" 서비스 로직 작성아래 서비스 계층에는getClientIP() : request 객체를 바탕으로 IP를 추출하는 메서드 ge..

[GitHub Actions] Self-Hosted Runner
서버 구축기2025.01.09 17:42[GitHub Actions] Self-Hosted Runner

self-hosted runner를 사용한 이유는 깃허브에서 제공하는 러너를 사용하면 ssh키를 입력하여 기본 제공 러너가 내 서버로 원격 접속해서 배포를 하게 되는데, 나는 내 서버의 ssh키를 누구에게도 알려주고 싶지 않았기 때문에 이를 사용하게 되었다.self-host runner 설치자신의 깃허브 계정에서 원하는 레포지토리의 setting 탭의 Actions -> Runners에 들어간다.설정하고자 하는 로컬 머신에 맞는 이미지와 아키텍쳐를 선택한다.나는 N100 기반의 머신이기 때문에 x64를 선택하였다. 선택하면 아래와 같이 친절하게 명령어가 주어진다.Self-hosted Runner로 등록하고자 하는 기기에서 폴더 생성mkdir actions-runner && cd actions-runne..

[Ubuntu] GeoIP 를 이용한 해외 IP SSH 접속 차단
서버 구축기2025.01.02 19:39[Ubuntu] GeoIP 를 이용한 해외 IP SSH 접속 차단

2024.11.29 - [서버 구축기] - [Ubuntu] ssh 원격접속 보안 강화 [Ubuntu] ssh 원격접속 보안 강화최근에 개인 서버를 마련했다. 이 서버에 내 개인 프로젝트를 구동시킬 예정인데, 보안이 신경쓰여 내가할 수 있는 방법을 최대한 써서 보안을 강화하려고 한다. 아래의 내용을 따라하면 다음til.seungwook.com위 글에서 uwf, fail2ban 등 기본적인 보안 설정을 마쳤습니다. ssh포트로 접속하는 요청이 해외에서 들어올 때 이를 차단을 하면 보안이 더 향상될 것이라고 생각을 하였습니다.1차적으로 해외 아이피를 차단하고, 2차적으로 fail2ban을 통해서 한국 아이피로 지속적인 접속 요청을 차단하는 방식을 생각하였습니다. 기본 설치 및 세팅설치geoip-bin과 geo..

[Nginx] Nginx 기본 보안 설정
서버 구축기2024.12.28 18:16[Nginx] Nginx 기본 보안 설정

먼저/etc/nginx/nginx.conf : Nginx의 메인 설정 파일이며, 글로벌 설정 및 기본 동작 방식을 설정하기 위해 사용/etc/nginx/sites-enabled/default : 개별 서버 블록(사이트) 설정 파일이다. 특정 사이트나 도메인에 대한 설정을 정의이 두 파일의 차이점을 알고 가야한다. 또한 필자는 인증서를 Certbot을 통해서 발급 받았다. 메인 설정 파일 수정sudo nano /etc/nginx/nginx.conf http블록 안에 아래의 내용을 추가한다.(이미 정의되어 있다면 변경한다.)# Nginx 버전정보 노출 끔server_tokens off;# SSL Settingsssl_protocols TLSv1.2 TLSv1.3; # SSL/TLS 인증은 TLSv1, TLS..

[MySQL] MySQL 보안 설정
서버 구축기2024.12.27 18:09[MySQL] MySQL 보안 설정

서버 환경 : Ubuntu 24.04 LTSMySQL 버전 : 8.0.40 MySQL 설치설치MySQL을 먼저 설치한다.sudo apt update && sudo apt upgrade -ysudo apt install mysql-server -y 설치된 버전을 확인하여 정상적으로 설치되었는지 확인한다.mysql --version나는 위 명령어를 실행했을 때 mysql  Ver 8.0.40-0ubuntu0.24.04.1 for Linux on x86_64 ((Ubuntu)) 이 결과가 나왔다. 보안 스크립트 설정보안을 강화하기 위해 아래의 보안 스크립트를 실행한다.sudo mysql_secure_installation Securing the MySQL server deployment. Connecting ..

[Ubuntu] 외장 SSD ext4 초기화 + 마운트
서버 구축기2024.12.26 13:50[Ubuntu] 외장 SSD ext4 초기화 + 마운트

먼저 SSD를 연결한 후, 디스크가 인식되었는지 확인한다.lsblksda: 477GB 디스크(내부 디스크)sda1: /boot/efi에 마운트된 1GB 파티션.sda2: 루트 파일 시스템(/)에 마운트된 476GB 파티션.sdb: 931GB 디스크 (외장 SSD)sdb1: 전체 디스크 크기를 사용하는 단일 파티션. ext4로 포맷현재 내 외장 ssd는 exFAT으로 포매팅되어있다. 아래의 명령어로 이를 확인할 수 있다.sudo blkid /dev/sdb1 또한 마운트가 되어있다면 마운트를 해제해야 하지만, 마운트를 한적이 없기 때문에 그대로 포맷을 진행한다. mkfs.ext4 명령어를 통해 포맷을 진행한다.server-ssd는 디스크 라벨을 지정한 것이고, dev/sdb1는 현재 연결된 외장 SSD 파티..

PostgreSQL2024.12.24 15:36[PostgreSQL] 외부에서 접속할 때 비밀번호 요구

나는 PostgreSQL을 homebrew를 통해서 설치하였다. nano /opt/homebrew/var/postgresql@14/pg_hba.conf이 파일을 열면 아래 부분에 아래와 같이 기본적으로 설정되어있다.# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections onlylocal all all trust# IPv4 local connections:host all all 127.0.0.1/32 ..

[Ubuntu] ssh 원격접속 보안 강화
서버 구축기2024.11.29 10:53[Ubuntu] ssh 원격접속 보안 강화

최근에 개인 서버를 마련했다. 이 서버에 내 개인 프로젝트를 구동시킬 예정인데, 보안이 신경쓰여 내가할 수 있는 방법을 최대한 써서 보안을 강화하려고 한다. 아래의 내용을 따라하면 다음과 같은 보안적인 이점이 있다.SSH 포트번호 변경root 계정 SSH 접속 비허용RSA를 이용한 공개키 기반 인증허용된 포트만 열어둠(UFW)비정상적인 접근 차단 및 로깅(fail2ban)SSH 2단계 인증(2FA) 서버 환경은 Ubuntu 24.04 LTS 버전에서 이뤄졌다는점 참고 바랍니다. SSH 포트번호 변경ssh 설정파일을 변경해서 포트번호를 바꾸어햔다.sudo nano /etc/ssh/sshd_configPort 부분에 주석이되어있을 텐데 주석을 해제하고 원하는 포트번호로 바꾼다. sudo nano /lib/s..

JPA2024.11.21 17:09[JPA]PostgreSQL 사용시, 엔티티에 Enum 매핑 오류

개발 환경SpringBoot 3.3.5Java 17PostgreSQL 14 문제 상황ERROR: column "XXX" is of type XXX but expression is of type character varying  Hint: You will need to rewrite or cast the expression. @Enumerated(EnumType.STRING)@Column(nullable = false, name = "level")private UserLevel level;  엔티티에 ENUM 타입이 있는데 이를 enum이 아닌 문자열로 인식해서 발생하는 문제임을 알았다.XXX(예시) 라는 컬럼이 있는데, PostgreSQL에서는 ENUM으로 만들었지만, JPA에서 이를 문자열로 인식한 상..

image