All
34 posts
Java Stream 최종 처리

1. 최종 처리 스트림은 중간 처리, 최종 처리 과정을 거친 후에 결과값을 반환합니다. 최종 처리는 중간 처리에서 정제된 요소들을 반복하거나, 집계(카운팅, 총합, 평균) 작업을 수행합니다. 주의할 점은 최종 처리를 꼭 해줘야 한다는 것입니다. 최종 처리를 하지 않으면 중간처리도 동작하지 않습니다. 2. 최종 처리 종류 2.1 매칭 매칭은 요소들이 특정 조건을 만족하는지 여부를 조사하는 최종 처리 기능입니다. 메서드는 , , 가 있습니다. 매개값으로 주어진 가 리턴하는 값에 따라 boolean 값을 리턴합니다. 예시 Output 2.2 집계 집계는 요소들을 처리해서 카운팅, 합계, 평균값, 최대값, 최소값등과 같이 하나의 값으로 산출하는 최종 처리 기능입니다. , , , , , , 가 있습니다. 예시 Output 2.3 수집 수집은 필터링 또는 매핑한 후 요소들을 수집하는 최종 처리 기능입니다. 메서드를 사용합니다. 메서드는 를 매개변수로 사용합니다. Collect<…

Java Stream 중간 처리

1. Java Stream Java 8부터 컬렉션 및 배열의 요소를 반복처리하기 위해 추가된 기능 2. Stream 특징 내부 반복자이므로 처리 속도가 빠르고 병렬 처리에 효율적이다. 람다식으로 다양한 요소 처리를 정의할 수 있다. 중간 처리와 최종 처리를 수행하도록 파이프 라인을 형성할 수 있다. 3. 중간 처리, 최종 처리 스트림은 중간 처리, 최종 처리 과정을 거친 후에 결과값을 반환합니다. 중간 처리는 요소를 걸러내거나(필터링), 요소를 변환시키거나(매핑), 정렬하는 자업을 수행합니다. 최종 처리는 중간 처리에서 정제된 요소들을 반복하거나, 집계(카운팅, 총합, 평균) 작업을 수행합니다. 주의할 점은 최종 처리를 꼭 해줘야 한다는 것입니다. 최종 처리를 하지 않으면 중간처리도 동작하지 않습니다. 예시로 사용할 Student 클래스입니다. Output 4. 스트림 생성 java.util.stream 패키지에는 스트림 인터페이스들이 있습니다. BaseStream 인터페이스를…

Java List

1. Java list 요소를 순차적으로 저장하고 중복을 허용하는 데이터 집합입니다. java.util 패키지 내부에 있고, Collection 인터페이스의 하위 인터페이스입니다. 2. List 종류 2.1 ArrayList ArrayList는 배열을 기반으로 만들어진 자료구조입니다. 배열은 크기가 고정이지만, ArrayList는 동적으로 늘릴 수 있습니다. 검색을 할 경우 인덱스로 조회하기 때문에 속도가 빠릅니다. 데이터 추가, 삭제를 할 경우 이후의 데이터를 복사 후 재정렬하기 때문에 빈번한 추가, 삭제에는 부적합합니다. Capacity 내부적으로 저장이 가능한 메모리 용량(Capacity)이 있으며 현재 사용 중인 공간의 크기(Size)가 있습니다. 인스턴스의 capacity 값 이상을 저장하려고 할 때 더 큰 공간의 메모리를 새롭게 할당합니다. ArrayList 코드를 보면서 어떻게 구성되었고 동작하는지 확인해보겠습니다. 기본 가용량(DEFAULT_CAPACITY)은 …

Java Set

1. Java set Set 컬렉션 클래스는 Set 인터페이스를 구현한 클래스입니다. Set 컬렉션 클래스는 요소의 저장 순서를 유지하지 않고, 같은 요소의 중복 저장을 허용하지 않습니다. 따라서 중복을 제거해야 하거나 저장 순서가 중요하지 않을 때 자주 사용하는 컬렉션 클래스입니다. 2. Map 종류 2.1 HashSet 해시 알고리즘을 사용하여 검색 속도가 빠르고, 내부적으로 HashMap 인스턴스를 이용하여 요소를 저장합니다. HashSet은 요소를 삽입할 때 이미 존재하는 요소인지 파악하기 위해 내부적으로 다음과 같은 과정을 거칩니다. 해당 요소에서 메서드를 호출해 반환된 해시 값으로 검색할 범위를 결정한다. 해당 범위 내의 요소들을 메서드로 비교한다. output 2.2 LinkedHashSet HashSet과 동일한 구조를 가지지만 삽입된 순서를 저장하는 Set 자료구조입니다. output 2.3 TreeSet TreeSet은 요소를 정렬해서 저장합니다. 내부적으로…

Java Map

1. Java map Java에서 Map 인터페이스는 java.util 패키지에 있으며 키와 값 간의 매핑을 나타냅니다. Collection 인퍼페이스와는 다른 저장방식을 가집니다. 맵은 사전과 같은 키-값 연결 매핑에 사용하기에 완벽합니다. 맵은 키로 조회를 수행하거나 키로 요소를 검색하고 업데이트하려고 할 때 사용됩니다. 2. Map 특징 맵은 중복 키를 포함할 수 없으며 각 키는 최대 하나의 값에 매핑할 수 있습니다. 저장 순서는 특정 구현에 따라 다릅니다. TreeMap과 LinkedHashMap은 예측 가능한 순서가 있지만, HashMap에는 순서가 없습니다. Java에서 map을 구현하기 위한 두 가지(Map, SortedMap) 인터페이스와 세 가지 클래스(HashMap, TreeMap 및 LinkedHashMap)가 있습니다. 3. Map 종류 3.1 HashMap HashMap은 해싱 기술을 사용합니다. 해싱은 큰 문자열을 동일한 문자열을 나타내는 작은 문자열로 …

JVM의 내부 구조

1. JVM 이란? Java 프로그램이 실행되기 위해 필요한 런타임 환경을 제공하는 프로그램입니다. C와 같은 프로그래밍 언어에서는 코드는 먼저 플랫폼별 기계어로 컴파일됩니다. 이러한 언어를 컴파일 언어라고 합니다. 반면 javascript 및 python과 같은 언어에서는 컴퓨터가 코드를 컴파일하지 않고 직접 실행합니다. 이러한 언어를 인터프리터 언어라고 합니다. Java는 두 기술을 조합하여 사용합니다. 소스 코드는 먼저 바이트 코드로 컴파일 되어 클래스 파일을 생성합니다. 이 클래스 파일은 기본 플랫폼에 대한 JVM에 의해 해석됩니다. 모든 플랫폼 및 운영 체제에서 실행되는 모든 버전의 JVM에서 동일한 클래스 파일을 실행할 수 있습니다. 2. JVM의 동작 방식 자바 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받습니다. 자바 컴파일러가 자바 소스코드를 자바 바이트 코드로 컴파일 합니다. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 …

Unknown system variable 'transaction_isolation'

에러 상황 Mac OS 환경에서 Mariadb 를 homebrew로 설치했습니다. 이후 spring 에서 작업 시 MySQL 커넥터를 사용해서 DB를 연동했습니다. 잘 사용하다가 파이썬을 설치한 이후로 해당 에러가 발생하고 JDBC DB 연동이 안됐습니다. 에러 원인 transaction_isolation 트랜잭션의 격리수준을 설정하는 변수입니다. 격리수준에 따라 다음처럼 나뉩니다. InnoDB의 기본 격리수준은 REPEATABLE READ 입니다. READ UNCOMMITTED READ COMMITTED REPEATEABLE READ SERIALIZABLE To determine the global and session transaction isolation levels at runtime, check the value of the tx_isolation system variable (note that the variable has been renamed transaction_i…

B-Tree 인덱스

B-Tree 자식 2개 만을 갖는 이진 트리를 확장하여 N개의 자식을 가질 수 있도록 고안된 것입니다. 좌우 자식 간의 균형이 맞지 않을 경우에는 매우 비효율적이라, 항상 균형을 맞춘다는 의미에서 Balanced Tree 라고 불립니다. 최상위에 단 하나의 노드 만이 존재하는데, 이를 루트 노트라고 합니다. 중간 노드를 브랜치 노드, 최하위 노드를 리프 노드라고 합니다. 각 노드가 키를 오름차순으로 포함하도록 데이터를 저장합니다. 이러한 각 키에는 다른 두 개의 하위 노드에 대한 두 개의 참조가 있습니다. 왼쪽 자식 노드 키는 현재 키보다 작고 오른쪽 자식 노드 키는 현재 키보다 큽니다. 페이지 디스크와 메모리에 데이터를 읽고 쓰는 최소 작업 단위입니다. 일반적으로 인덱스를 포함해 PK와 테이블 등은 모두 페이지 단위로 관리됩니다. 만약 쿼리를 통해 1개의 레코드를 읽고 싶더라도 하나의 블록을 읽어야 하는 것입니다. B-Tree 인덱스 가장 일반적인 인덱스로 B-Tree 구조를 …

NoSQL

NoSQL 이란 비관계형 데이터베이스 유형을 가리킵니다. NoSQL 데이터베이스는 언어마다 관습화된 API, 선언적 구조와 쿼리 언어, 쿼리별 언어를 사용하여 질의할 수 있습니다. 이러한 이유로 not only SQL 데이터베이스라고 불립니다. NoSQL의 등장배경 스토리지 비용 감소 2000년대 말에 스토리지 비용이 크게 하락하면서 등장했습니다. 단순히 데이터 중복 감소를 목적으로 복잡하고 관리하기 어려운 데이터 모델을 생성해야 하던 트렌드가 바뀐 것입니다. 비정형 데이터 인터넷이 활성화되고, SNS 등이 등장하면서 저장해야 하는 데이터의 양이 증가했습니다. 이러한 데이터는 정형, 반정형 등 모양과 크기가 모두 다르기 때문에 미리 스키마를 정의하는 것이 거의 불가능해졌습니다. 개발자가 엄청난 양의 비정형 데이터를 저장할 수 있도록 지원하기 위해 등장했습니다. 유연한 개발 방식 애자일 방법론의 인기가 높아지면서 소프트웨어 개발자들은 소프트웨어 개발 방식을 재고하기 시작했습니다. …

조회 쿼리 메서드 사용 시 불필요한 Join 이 사용되는 이유

⏰ 성능 이슈 발생 쿼리 메서드를 작성하고 의도한대로 작동했는지 확인하고 있었습니다. 엔티티에 존재하는 applicant, group, status 필드를 조건으로 하여 데이터를 조회하는 쿼리 메서드입니다. Repository Entity 제가 의도한 동작 방식은 조인을 하지 않고 Subscription 엔티티의 필드만으로 데이터를 조회하는 것이었습니다. Join 이 사용된 이유가 궁금했습니다. 🔍 성능 이슈 원인 의심이 됐던 원인은 쿼리 메서드 작성 시, 조건으로 외래키(ApplicantId, GroupId) 값을 사용했고, 엔티티에는 연관관계의 객체(User, Group)가 있다는 것입니다. 쿼리 메서드가 외래키를 읽지 못하고 join 이 발생한다? 이렇게 생각하기에는 이해가 되지 않아서 쿼리메서드의 동작 과정을 찾아봤습니다. 쿼리 메서드 동작 과정 Property travelsal Property expressions can refer only to a direct prop…

엔티티 저장 시 Select 쿼리를 호출 하는 이유

⏰ 성능 이슈 발생 서비스 로직을 테스트 하는 중이었습니다. 클라이언트는 api 호출 시, naver map api 로 부터 조회 받은 식당 ID 값과 서버로 보내준다. 서버는 식당 ID 값과 추가 정보를 DB 에 저장한다. 간단한 로직이기에 문제는 없을 거라 생각했습니다. 그런데 식당 정보를 DB 에 저장할 때 select 쿼리가 호출됐습니다.. Insert 쿼리를 호출하기 전에 select 쿼리가 반복적으로 호출된다면, 클라이언트의 api 호출 수만큼 select 쿼리가 호출되는 것입니다. 서버에 불필요한 부하가 추가되는 로직이므로 수정이 필요했습니다. 🔍 성능 이슈 원인 save 엔티티를 저장하는 save 메서드는 아래 코드로 구현되어 있습니다. 저장될 엔티티가 새로운 엔티티인지 확인합니다. 새로운 엔티티면 저장하고, 아니라면 merge 메서드로 업데이트 합니다. merge 영속 컨텍스트에서 merge 의 동작방식은 merge() 실행 2. 엔티티의 식별자 값으로 1차 캐시…

Elastic Beanstalk + Docker + Java 설정

🤔 적용 이유 AutoScaling, LoadBalancer EB를 사용해본 적은 없으나 사용율이 증가하면 scale out 했다가, 다시 줄어들면 scale in 을 할 수 있는 AutoScaling Group과 서버의 부하를 나누어 주는 LoadBalancer를 간편하게 설정할 수 있는 점이 장점으로 느껴졌습니다. 다른 여러 장점은 사용해보기 전에는 와닿지 않아서 ‘사용해보고 느껴보자’ 해서 사용했습니다. ⚙️ 설정 방법 1. IAM 역할 추가 Elastic beanstalk(이하 EB) 의 환경을 구성하기 위해 각 역할에 권한이 필요합니다. 1.1 서비스 역할 EB를 서비스로 사용하므로 담당할 IAM 역할을 부여합니다. Elastic Beanstalk 서비스 역할 관리 설정하지 않을 시, 다음과 같은 에러를 만나게 됩니다.. Configuration validation exception: Invalid option specification (Namespace: ‘aws:ela…

Elastic Beanstalk + Docker + Java 설정

🤔 적용 이유 AutoScaling, LoadBalancer EB를 사용해본 적은 없으나 사용율이 증가하면 scale out 했다가, 다시 줄어들면 scale in 을 할 수 있는 AutoScaling Group과 서버의 부하를 나누어 주는 LoadBalancer를 간편하게 설정할 수 있는 점이 장점으로 느껴졌습니다. 다른 여러 장점은 사용해보기 전에는 와닿지 않아서 ‘사용해보고 느껴보자’ 해서 사용했습니다. ⚙️ 설정 방법 1. IAM 역할 추가 Elastic beanstalk(이하 EB) 의 환경을 구성하기 위해 각 역할에 권한이 필요합니다. 1.1 서비스 역할 EB를 서비스로 사용하므로 담당할 IAM 역할을 부여합니다. Elastic Beanstalk 서비스 역할 관리 설정하지 않을 시, 다음과 같은 에러를 만나게 됩니다.. Configuration validation exception: Invalid option specification (Namespace: ‘aws:ela…

Could not safely identify store assignment for repository candidate interface

🚫 에러 상황 Redis 내의 Refresh token 값을 다루기 위해 CrudRepository 를 사용하고, RDBMS 내의 데이터를 다루기 위해 JpaRepository 를 사용했습니다. 프로젝트를 실행하면 뜨는 여러 로그 중 에러는 아니지만, 반갑지 않은 INFO 로그가 2개의 영역으로 나뉘어 7개 정도 반복되는 것을 확인했습니다. 엔티티 클래스 수 만큼 반복 되었고, 아래처럼 로그가 출력됐습니다. A 영역: Spring Data JPA B 영역: Spring Data Redis 로그는 두개의 영역으로 나뉘었고, 읽어보면 “Spring Data JPA: 엔티티의 레포지토리에 대해 식별할 수 없다. 만약 이 레포지토리를 JPA repository로 만들려면 @Entity 어노테이션을 사용해라” “Spring Data Redis: 엔티티의 레포지토리에 대해 식별할 수 없다. 만약 이 레포지토리를 Redis repository로 만들려면 @RedisHash 어노테이션을 사용해…

뮤텍스(Mutex)와 세마포어(Semaphore)

📕 개념 ❌ 교착 상태(Deadlock) 노트북으로 코딩을 하고 싶은 두 사람 A, B(프로세스/스레드) 가 있다. A는 배터리가 0% 인 노트북(자원)을 가지고 있고(점유) 충전기 를 기다리고 있다(대기). B는 충전기(자원)를 가지고 있고(점유) 노트북을 기다리고 있다(대기). 이처럼 서로 자원을 놓아줄 생각은 없고, 자원 요청을 무한정 대기하고 있는 상태 를 말합니다. Critical section(임계 영역) 여기서 노트북과 충전기를 공유 자원이라고 부르고, 공유자원이 속해 있어 교착 상태가 발생할 수 있는 영역을 임계영역이라고 부릅니다. 공유 데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드만 진입해서 실행(상호배제)가능한 영역입니다. 교착 상태가 발생하기 위해서는 네가지 조건을 충족해야 합니다. 이중 상호배제를 중점으로 알아보려 합니다. 상호배제 점유대기 비선점 순환대기 Mutual exclusion(상호 배제) 프로세스/스레드가 필요로 하는 공유자원에 대해 배타적…

Spring rest docs 설정

🤔 적용 이유 프론트엔드 개발자는 백엔드 개발자가 작성한 api 문서를 보고 api 를 매핑합니다. 문서를 작성하는 것은 노동력이 들어가는 것이고, 사람이 작성하기 때문에 변경된 사항을 업데이트를 하지 않는 경우도 존재합니다. spring-rest-docs 는 테스트 코드를 작성해야 하고, 빌드 시 api 문서가 자동으로 생성됩니다. 테스트 코드를 작성하면서 검증된 api 문서를 자동으로 생성할 수 있다! vs Swagger Swagger 도 문서화를 위해 많이 사용된다고 했습니다. 보다 UI 가 깔끔해보이는 장점이 있었습니다. spring-rest-docs 와 달리 테스트 코드가 의무가 아니므로 빠른 시간 내의 문서를 작성할 때 용이할 거라 생각이 듭니다. 단점으로는 컨트롤러 코드 주위에 문서를 위한 코드를 작성해야 된다는 점입니다. 가독성이 중요하다고 판단되어 spring-rest-docs 를 사용하기로 결정했습니다. ⚙️ 적용 하기 1. build.gradle build 시 자…

Builder 어노테이션 사용시, List 추가에 대한 NullPointerException

🚫 에러 상황 builder 패턴을 사용하여 유저 인스턴스를 생성했고, userGroups 필드(List)에 데이터를 추가하자 NullPointException 이 발생했다. java.lang.NullPointerException: Cannot invoke “java.util.List.add(Object)” because the return value of “user.domain.User.getUserGroups()” is null User 엔티티 User 생성 - builder 사용 📜 에러 원인 null 인 리스트에 데이터를 추가할 수 없다는 것이다. 엔티티에서 리스트 필드를 초기화 했음에도 불구하고 null 인 상황인다.. 의심가는 건 builder 메서드를 사용 시 List 의 값은 입력하지 않았다. 알아보니 builder 패턴은 엔티티에서 초기화한 값을 무시하고 초기화를 한다. 따라서 builder 패턴 사용 시, 생성된 유저의 List 필드는 아래와 같았을 것이다. 🔑 …

docker, nextjs 이미지 배포하기 - 2 (github action 자동 배포)

[docker] node, nextjs 이미지 배포하기 - 1 이전 게시물과 이어지는 내용입니다. 추가 설명이 필요한 부분은 이전 게시물을 참고 해주시면 됩니다. 자동화가 필요해.. 전 게시물에서 node 와 nginx 를 도커 이미지로 생성했고, 각 컨테이너를 실행하는 쉘 스크립트를 만드는 내용을 작성했습니다. 쉘 스크립트를 이용한 수동 배포의 단점 사용자는 쉘 스크립트(도커 이미지를 생성하고 HUB에 푸시함) 실행 후 버전 입력 운영 서버에 접속 쉘 스크립트(도커 이미지를 pull 받고 컨테이너를 실행함) 실행 후 버전 입력 이러한 간단한 플로우로 이미지를 배포 및 버전 관리를 할 수 있습니다. 이러한 플로우에는 사용자는 다음과 같은 단점이 있습니다. 로컬, 운영서버 각 환경에서 배포하는 이미지의 버전를 입력해야 합니다. (총 2번) 언제 끝날지 모르는 도커 빌드, 푸시 시간이 끝나기를 기다려야 합니다. 도커 푸시 후, 서버에 접속해서 이미지를 전송 받아야 합니다. 해결책 = …

docker, nextjs 이미지 배포하기 - 1 (+쉘 스크립트)

프론트 개발자도 도커 이미지를 만들어야 할까? 1. 백엔드 개발자와 협업 백엔드 개발자가 JAVA, DB 등을 도커HUB 에 배포하면, 프론트엔드 개발자가 해당 이미지를 내려 받고 컴포즈 하는 방식으로 작업했습니다. 그런데 백엔드 개발자를 많이 만나보지는 않았지만, 같이 협업을 하다보면 ‘제 자리에서도 프론트 코드를 실행하고 싶어요’, ‘화면을 보면서 테스트 하고 싶어요’ 등등 백엔드 개발자의 요구 사항이 생겼습니다. 처음에는 도커가 왜 필요한지 몰랐기에 백엔드 개발자 자리에서 git clone node install env 파일 전달 os 가 달라서 생기는 오류 해결… 그래서 언제 되는거죠..? 이 모든 것을 진행하다가 결국 서버로 배포해서 확인을 했었습니다. 만약에 nextjs 를 도커 이미지로 만들었다면, 이런 불편함은 없었을 겁니다. 2. 운영환경의 빌드파일 버전 관리 이전 프로젝트에서 CI/CD 를 적용하기 위해 jenkins, github-action 을 사용했습니다. …

Ubuntu 환경에서 root 사용자로 ssh 접속하기

root 접속하는 이유 Ec2 인스턴스 생성 시 ubuntu 계정으로 접속할 수 있습니다. 패키지를 설치하거나 쉘 스크립트를 실행할 때 sudo 를 사용하는 불편함을 줄이기 위함입니다. 설정방법 1. 초기 비밀번호 설정 2. ssh 설정 root 비밀번호 로그인 허용 시 PermitRootLogin yes root ssh 접속만 허용 시 PermitRootLogin prohibit-password private key 내용 확인 및 접속하기 위한 private key 를 추가 이렇게 설정하면 접속이 가능합니다. 에러 발생 시 authentication refused: bad ownership or modes for file /root/.ssh/authorized_keys ubuntu 계정으로 root 계정의 인증파일을 수정시 발생하는 오류입니다. root 폴더의 파일은 root 계정으로 작성 및 수정합니다. root 접속하는 이유 설정방법 1. 초기 비밀번호 설정 2. ssh 설…

aws ec2에 github action 으로 프론트 자동 배포하기

github action ? jenkins 와 더불어 CI/CD 구축을 위해 사용됩니다. github 에서 가상환경을 제공해줍니다. 장점 CI 를 위한 추가 서버가 필요 없다는 게 큰 장점이었습니다. git hook 에 따라 배포를 실행할 수 있습니다. 단점 유료 계정이 아니라서 그런지 몰라도 빌드 시간이 오래걸렸습니다. jenkins 로 배포할 때 총 20초 정도 걸렸었는데, 2분 정도 소요됐습니다. (s3 업로드 까지) 시작하기 과정을 간단하게 요약한 글입니다 보다 상세한 내용은 해당 글을 보시는걸 추천드립니다. https://blog.bespinglobal.com/post/github-action-%EC%9C%BC%EB%A1%9C-ec2-%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0/ 1. IAM 사용자 추가 github 코드를 s3 로 업로드하기 위해 인증된 사용자라는 검증하기 위해 사용됩니다. AWS - IAM > AWS 자격 증명 유…

SSL 인증(DNS, Nginx)

1 - CSR 생성 mac → 키체인 접근 → 인증서 지원 -> 인증기관에서 인증서 요청 2 - DNS 검증 SSL 인증서를 발급하기 전에, 해당 도메인의 소유주가 맞는 지 확인하는 검증 단계입니다. 도메인 구입 사이트 또는 호스팅 사이트에서 cname 등록인 필요합니다. (ex. aws route53, gabia 등) 하루를 기다려도 검증이 안될 시 잘못 입력한 부분이 있는지 확인해야 합니다. Type: CNAME Record Host: CNAME Value: CNAME value TTL: Automatic 🚫 주의할점: Host 입력 시 도메인 제거 후 입력할 것! 3 - SSL 인증서 다운로드 DNS 검증 완료 시 구매 사이트로부터 다운로드 4 - chain 파일 생성 (필요 시) SSL & CSR Decoder 접속 후 CSR 입력 후 DECODE Bundle (Nginx) 다운로드 5 - 개인키 파일 생성 mac → 키체인 접근 → 도메인 검색(ex. google.com)…

git hooks 를 husky 로 제어하기 (eslint, pre-commit)

1 - 들어가기 앞서.. 팀원과 컨벤션 정의 및 lint 규칙을 정하는 상황이 있습니다. 그런데 작업을 하다 보면 서로 코드 컨벤션에 소홀해지는 경우가 있습니다. 이런 상황일 때, 사용하면 좋은 도구가 husky 입니다. husky 를 사용하면 커밋 전, 푸시 전 등 git hooks 상황에 맞게 코드 규칙을 강제할 수 있습니다. 2 - 용어 및 도구 정리 git hooks git 과 관련한 이벤트가 발생했을 때, 추가 스크립트를 실행하는 기능 git hooks 는 클라이언트 훅과 서버 훅으로 나뉩니다. 클라이언트 훅은 git 이벤트를 실행 시, 실행자의 컴퓨터에서 실행하는 훅입니다. 서버 훅은 git 이벤트를 실행 시, 타 서버에서 실행하는 훅입니다. .git/hooks 폴더 내부에 보면 각 훅을 확인할 수 있습니다. husky git hooks 를 편리하게 사용하도록 도와주는 도구 git 이벤트 실행자는 클라이언트 훅을 사용할 수 있습니다. .git/hooks 폴더 내부에 존재…

git ssh 접속하기

1 - git 접속 에러 새로운 노트북을 이용할 때 github, gitlab 에 처음 계정을 연동해서 이용할 때 https remote 주소로 부터 깃을 관리할 때 권한 에러를 마주할 수 있습니다. 이에 대한 반복된 검색을 줄이면 좋을 거 같아서 포스팅을 시작합니다. github 에러 올바른 사용자 이름과 비밀번호를 입력했을 때 에러가 발생합니다. 가끔 마주하는 문구인데 읽어보면, 2021년 8월 13일 부터 비밀번호 인증지원은 제거됐다. 라고 나와 있고, 어떻게 적용할 지 링크를 알려줍니다. https 리모트를 적용하면 기본적으로 깃계정의 아이디와 패스워드를 입력합니다. 패스워드 인증을 지원하지 않는다고 하니 ssh 접속을 하는 방법이 필요합니다. 2 - git ssh 접속 방법 2.1 - ssh key 생성 우선, ssh-keygen 이 설치되어 있어야 합니다. https://git-scm.com/book/ko/v2/Git-%EC%84%9C%EB%B2%84-SSH-%EA%B3…

eslint(airbnb) + prettier + Next + Typescript + yarn 설정

패키지 소개 ESLint 란? (ES + Lint) 자바스크립트 소스 코드의 오류를 표시하기 위한 도구입니다. ES란, Ecma Script, 표준 자바스크립트 Lint란, 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류 등을 표시하기 위한 도구 Prettier 란? 코드를 예쁘고 일관성 있게 유지시켜주는 자동완성 도구입니다. eslint 로 소스코드를 분석하고, prettier 로 올바르게 문법을 자동으로 고칠 수 있으므로 함께 사용합니다. airbnb convention 란? 에이비앤비에서 만든 코딩 컨벤션(문법을 이렇게 작성하자! 라는 약속) 입니다. 여러 회사가 만든 코딩 컨벤션이 존재하며, 그중 에어비앤비에서 만든 약속입니다. 적용방법 1. eslint config 패키지 추가 eslint-config 로 시작하는 패키지를 설치 시 extends 옵션에 사용 extends 옵션을 통해 설정을 패키지의 설정을 적용할 수 있음 2. eslint plugin 패키지 추…

NextJS pre-rendering (Static Generation / Server-side Rendering)

1. react 는 pre-rendering 지원 안됨 검포넌트가 렌더링 되고 나서 서버로 api 요청을 한다 검색엔진이 인덱싱하기 어렵다(블로그, 쇼핑몰 등 필요할 시) 따라서 nextJS 를 사용해서 pre-rendering을 적용한다. 2. pre-rendering 두가지 방법으로 나뉨: Static Generation / Server-side Rendering 함수가 실행되는 시점에 따라 나누는 것 빌드 시에 페이지를 만든다(npm start: build 한 파일을 실행하는 것 npm run dev 랑 다름) 프리랜더링은 컴포넌트의 함수보다 먼저 실행된다 (getStaticProps) Incremental Static Generation: 특정 시간이 지나기 전까지는 초기 페이지를 보여주고 이후에는 지난 페이지 보여줌 2-1. getStaticProps Static Generation 빌드 시 페이지를 생성 데이터 패칭 실패 시 redirect, destination 또는 …

Ionic React 시작하기

Ionic 1. Ionic 이란 아이오닉 페이지는 스스로를 이렇게 소개합니다. https://ionicframework.com/ An open source mobile UI toolkit for building modern, high quality cross-platform mobile apps from a single code base in React.Vue.Angular. 아이오닉은 리액트, 뷰, 앵귤러에서 최신 고품질의 크로스 플랫폼 앱을 구축하기 위한 오픈 소스 모바일 UI 툴킷입니다. 2. Ionic react vs react native 크로스 플랫폼 앱을 구현하기 위해 사용되는 것으로 리액트 네이티브도 있습니다. 아이오닉 리액트와 리액트 네이티브는 어떤 점이 다른지 읽어봤습니다. https://ionic.io/resources/articles/ionic-react-vs-react-native Ionic React is web-first, meaning that it i…

Namecheap SSL 인증서 재발급 후기 (Https 적용)

포스팅 배경 Namecheap SSL 인증에 대한 자료 부족 Namecheap 사이트에서 생성한 SSL 인증서가 만료되어, https 적용을 위해 재발급 했습니다. Namecheap 에서 제공하는 문서만으로는 재발급이 쉽지 않아서 작성했습니다. 이 게시물이 저와 같은 상황의 분들에게 도움이 되면 좋겠습니다. 순서 인증서 발행 인증서 다운로드 CNAME 등록 모든 인증서 파일을 단일 파일로 결합 Nginx 설정 확인 및 재실행 전체 과정 1. 인증서 발행 https://ap.www.namecheap.com/domains/ssl/detail/*CertificateID*/*PrimaryDomain*/dashboard 해당 페이지로 접속하거나, Namecheap 사이트에서 Domain List → Details → SSL → Details 로 이동합니다. (갱신하고자 하는 Domain 과 Certificate 선택) 만료된 CSR Code 를 복사합니다. 만료된 CSR Code를 사용…

Jenkins 자동 배포하기 (+github 연동)

포스팅 배경 Jenkins를 실무에서 왜 사용할까? 이전 직장에서 xshell, total commander 를 사용하여 수동으로 배포를 했었습니다. 상당히 위험한 순간도 많았고, 실수한 적도 많았습니다. 이에 대한 불편함을 느끼고, 현 직장에서는 자동 배포환경을 구축했습니다. 이로 인해 동료 개발자도 배포가 쉬워지는 장점을 느꼈습니다. 기억보단 기록 Jenkins 환경 구축을 4번했습니다. 잦은 장비 변경으로 인해 window, linux, mac, docker 등 각 OS에 모두 설치할 때마다 이전 과정이 기억나지 않았고, 많은 시간을 소비했습니다. 기록에 대한 필요성을 느꼈고, 저와 같은 불편함을 겪는 분들에게 도움이 되면 좋겠습니다. 순서 Jenkins 설치 및 계정 설정 Jenkins - github 계정 연동 설정 프로젝트 생성 프로젝트 - github repository 연동 설정 플러그인 설치, 설정(ex. node, publish over ssh) Build ste…

www.google.com을 검색 시 발생하는 일 - [ 브라우저 렌더링 ]

www.google.com을 검색 시 화면이 출력되는 과정 사용자가 주소창에 구글 주소를 입력한다. (https://www.google.com) DNS에서 도메인 주소에 해당하는 IP 주소를 찾는다. 브라우저가 서버와 TCP connection을 한다. 브라우저가 서버에 HTTP 요청을 한다. 서버가 HTTP 응답을 보낸다. html 파일과 CSS 파일을 각각 파싱 하여 DOM, CSSOM Tree를 만든다. (Parsing) DOM Tree 와 CSSOM Tree를 결합하여 Render Tree를 만든다. Render Tree에서 각 노드의 위치와 크기를 계산한다. (Layout) Layout 단계에서 계산된 값을 여러 Layer로 나눠 픽셀을 채워 넣는다. (Painting) 여러 Layer로 나누어진 픽셀들을 우리가 보는 화면처럼 합성해 준다. (Composite) 15 번은 통신과 관련된 과정이고, 611 번은 화면이 어떻게 그려지는지(렌더링)에 대한 과정입니다. 본 게시물…

CORS Error [ vue 에서 외부 API 요청 시 ]

​ 에러 배경 vue 에서 kakao map api 를 사용하여 지도에서 맛집(장소)을 검색했다. 주소 이외의 장소에 대한 상세정보가 필요했다. 카카오 플레이스 (map.place.kakao) 로 장소에 대한 정보를 조회 요청했다. Cors Error 발생 ​ 에러 발생 이유 로컬 주소(localhost:8000) 와 조회하려는 주소(map.place.kakao:443) 의 출처가 다르다. ​ CORS Error (Cross-Origin Resource Sharing) 간단히 말해서, 브라우저에서 요청하는 주소와 응답하는 주소(출처)가 다를 때 허락한 요청 외에는 에러를 발생시키겠다. ​ ex) 둘을 비교하면 프로토콜(http) 와 호스트(loaclhost), 포트(8000) 모두 다르다. 에러 발생 요청하는 주소: http :// localhost : 8000 응답하는 주소: https :// map.place.kakao : 443 ​ 허락한 요청이란? 출처가 다르더라도 요청을 …

SPA(Single Page Application) - [2] CSR/SSR

안녕하세요. 이번 게시물은 이전 게시물 [SPA - 등장 배경]의 다음 편입니다. 이전 게시물에서는 SPA가 등장한 배경, MPA와 차이점을 소개했습니다. SPA는 하나의 페이지를 서버로부터 받아와 브라우저에서 렌더링을 하며 내용을 채웁니다. 이는 CSR과 궁합이 맞으며, 실제로 SPA + CSR로 많이 사용됩니다. 반면 MPA는 문서에 대한 처리를 서버에서 전적으로 하므로, SSR과 궁합이 맞습니다. 따라서, 이번 게시물에서는 SPA/MPA 원리와 연관이 있는 CSR/SSR에 대해 소개하려 합니다. CSR(Client Side Rendering) 클라이언트에서 렌더링을 하는 것 클라이언트는 빈 껍데기의 index.html을 받고, 추가로 서버로부터 js 파일을 다운로드합니다. 추가로 필요한 데이터는 서버에 요청해서 데이터를 받은 다음에 동적으로 html을 생성합니다. 장점 페이지를 전환하는 과정에서 링크로 이동하는 것이기 아니기 때문에 깜빡임이 없으므로 사용자 친화적이다. 서버…

AWS EC2 Node.js 서버 연결 안될 때 ( 사이트에 연결할 수 없음 )

에러 배경 node js 를 AWS 서버 에 배포했다. 웹 화면에서 api 요청 시 ‘사이트에 연결할 수 없음’ 에러 확인 ​ 에러 발생 이유 방화벽이 원인이었다. http 프로토콜과 포트를 열어주지 않아서 응답을 주지 않았다. ​ 에러 해결 과정 1. AWS 인바운드 규칙 확인 Instance 의 보안 그룹에 대한 포트를 열어줬는지 확인한다. ​ 2. 해당 포트가 실행되는 지 확인 netstat -tnlp 해당 포트가 실행되는 지 알 수 있다. ​ 3. 방화벽 허용하기 firewall-cmd —permanent —add-service=http firewall-cmd —permanent —add-service=https firewall-cmd —permanent —add-port=9000/tcp ​ 과거에 허용한 적이 없다면 success 과거에 허용한 적이 있다면 경고가 뜬다. 에러 배경 에러 발생 이유 에러 해결 과정 1. AWS 인바운드 규칙 확인 2. 해당 포트가 실행되는 …

SPA(Single Page Application) - [1] 등장 배경

많은 웹 프론트엔드 개발자가 React, vue, angular 프레임워크를 사용하여 개발한다. 이들은 모두 SPA 프레임워크이다. 그런데 SPA는 뭘까? SPA를 설명하기 앞서, SPA는 모던 웹의 패러다임이라고 한다. 과거 웹 페이지에 대비해 어떠한 목적으로 SPA를 사용하기 시작한 지 알아봤다. 1. 서버의 부하 감소 과거의 웹 페이지 형태(MPA, Multi Page Application)에서는 사용자가 메뉴를 클릭 시, 완전히 새로운 페이지를 서버에서 전송해 줬다. 서버에서 다음과 같은 작업이 이루어졌다. 사용자에게 요청이 들어오면, DB로부터 데이터를 가져온다. ASP, JSP, PHP 같은 파일에 데이터를 넣어준 후 HTML 형태화 시켜서 전송해 준다. ​ 과거의 웹 페이지에서 브라우저는 화면을 보여주기만 할 뿐, 요청한 웹 문서에 대한 처리는 전부 서버에서 담당한 것으로 보인다. 즉, 페이지가 요청될 때마다 서버에 부하가 생긴다. ​ SPA는 웹 애플리케이션에 필요한…