String 클래스에 대한 학습 테스트 요구사항1 "1,2"을 , 로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현한다. "1"을 , 로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현한다. @Test @DisplayName("요구사항1 - 1") void test1_1(){ String target = "1,2"; String[] temp = target.split(","); assertThat(temp).contains("1", "2"); } @Test @DisplayName("요구사항1 - 2") void test1_2(){ String target = "1"; String[] temp = target.split(","); assertTha..
OAuth 사용자의 정보를 가지고 있는 제3의 서비스로부터 접근 권한을 위임 받아서 웹 사이트의 자원에 접근하는 방식 사용자의 정보를 저장하고 관리해야 하는 부담을 줄일 수 있다. 사용자도 자신의 개인정보를 신뢰할 수 없는 타인에게 제공하는 단점을 해결한다. OAuth 제공자는 네이버, 카카오, 구글 등이 있다. JWT Header, Payload, Signature로 구성된 암호화된 토큰 session 기반 인증 방식과 달리 stateless한 구현이 가능하다. 로그인 흐름 Resource Owner(사용자)가 Client(서버) 자원에 접근하려 하면 Resource Server(OAuth 제공자)의 로그인 창을 호출하여 인증을 요구한다. 로그인을 성공하면 Resource Server에 로그인 API..
1. 스왑 파일 생성 root 경로(/)에 아래 명령어로 파일을 생성한다. bs는 블록 크기, count는 블록의 수 AWS에서 권장하는 스왑 공간은 RAM 2GB 이하는 RAM 용량의 2배, 128MB X 16 = 2048MB cd / sudo dd if=/dev/zero of=/swapfile bs=128M count=16 2. 스왑 파일에 대한 읽기 및 쓰기 권한을 업데이트 sudo chmod 600 /swapfile 3. 스왑 영역을 설정 sudo mkswap /swapfile 4. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 만든다 sudo swapon /swapfile 5. 절차가 성공했는지 확인 sudo swapon -s 6. /etc/fstab 파일을 편집하여 부팅..
자료구조란? 데이터를 추가, 삭제, 검색에 있어서 효율적으로 사용할 수 있도록 구조를 만들어서 저장해 둔 것 모든 자료구조 클래스에는 래퍼런스 타입의 데이터만 저장할 수 있다. java.util 패키지에 속하는 JDK 라이브러리의 자료구조 클래스들 자료구조 클래스 이름 리스트 ArrayList, LinkedList, Vector 스택 LinkedList, Stack 큐 LinkedList 해쉬 테이블 HashMap, Hashtable 집합 HashSet List 데이터를 일렬로 늘어놓은 자료구조 중복된 데이터를 저장하고 순서를 유지하는 선형 자료구조 선언 // ArrayList 선언 // 인덱스로 데이터 항목을 찾는 일이 많은 프로그램에서 유리함 ArrayList list = new ArrayList()..
역정규화 성능이나 개발의 편의성을 위해서 테이블의 구조를 바꾸는 것 여러 대의 서버로 데이터를 분산할 때 사용할 수 있다. 조인 줄이기 많은 조인은 시스템에 부하를 줄 수 있기 때문에 조인을 줄여서 부하를 줄일 수 있다. 조인을 하지 않고 테이블을 조회할 수 있도록 컬럼을 추가했다. 하지만, topic_tag_relation 테이블은 중복이 발생하고 tag 테이블이 존재하면서 동시에 tag_name 컬럼이 존재하는 중복도 같이 발생해버렸다. 계산 작업을 줄이기 GROUP BY와 같은 명령어는 데이터가 많은 경우 많은 비용이 발생할 수 있다. SELECT author_id, COUNT(author_id) FROM topic GROUP BY author_id topic_count 컬럼을 추가해서 쿼리를 대체..
정규화란? 정제되지 않은 데이터(표)를 관계형 데이터베이스에 어울리는 표로 만들어 주는 방법 제1정규화(1NF) : 각 컬럼이 단일 값을 가져야 한다. Unnoramalized form에서 SELECT * FROM topic WHERE tag = 'free' 또는 SELECT * FROM topic ORDER BY tag와 같은 쿼리를 하려고 할 때 문제점가 발생한다. 아래와 같이 표를 수정하면 제1정규화을 만족할 수 있지만 정보의 중복이 발생하거나 테이블 구조를 변경해야 하고 컬럼을 사용하지 않는 낭비가 발생할 수 있다. Topic과 Tag의 관계는 카디널리티가 M:N이다. M:N은 테이블을 나누는 것으로 끝나지 않고 매핑 테이블을 만들어 주어야 한다. topic의 title과 tag의 id를 키로 가..
인스턴스를 웹 서버로 사용하기 위해서 웹 서버가 사용할 포트를 개방해야 한다. 1. 컴퓨트 -> 인스턴스 -> 인스턴스 세부정보 -> 인스턴스 정보 탭 -> 기본 VNIC -> 서브넷 클릭 2. 보안 목록 -> 보안 목록 세부정보 -> 수신 규칙 추가 1. 소스 CIDR : 방화벽에서 허용하는 IP 범위. 0.0.0.0/0를 입력하면 모든 IP에서 접속 가능. 2. IP 프로토콜 : TCP 3. 대상 포트 범위 : 개방하고자 하는 포트 입력 참고 https://technfin.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%ED%8F%AC%ED%8A%B8-%EA%B0%9C%EB%B0%A9%ED%95%98..
i18n internationalization의 축약형 총 20자리 글자 중에 맨 앞 i와 맨 뒤 n을 제외한 나머지가 18글자가 있다고 해서 i18n 이다. MessageSource란? 국제화(i18n)를 지원하는 스프링 인터페이스 하나의 메세지에 대해서 다국어로 표시해주는 기능 제공 Entity 생성 @Entity @Getter @Setter public class Languages { @Id @GeneratedValue private Integer id; private String locale; private String messageKey; private String messageContent; } sample data 생성 쿼리 작성 src/main/resources 경로에 data.sql 파일..
docker 폴더 생성 mkdir docker cd docker docker 폴더에 "docker-compose.yml"과 ".env" 작성 docker-compose.yml을 git에 push할 경우 비밀번호가 노출되기 때문에 환경 변수로 설정해야 한다. docker-compose는 기본적으로 .env 파일을 환경 변수 파일로 인식된다. .env 파일을 작성하고 .gitignore에 추가한다. services: mariadb: container_name: mariadb image: mariadb:10.8.3 restart: always environment: - MYSQL_ROOT_PASSWORD=${MARIADB_PASSWORD} MARIADB_PASSWORD=mypassword 컨테이너 실행 doc..