All
117 posts
On-premise 8. 호스트 서버 모니터링 및 꺼짐 방지

홈 서버로 API 서버를 운영 중에 이벤트 뷰어 상에서 Windows 자동 업데이트 및 Kernel power 이벤트로 자꾸 서버가 재부팅되며 운영 상에 문제가 발생하였다. 이를 해결하기 위한 방법에 대한 글이다. 윈도우 OS 자동 재부팅 방지 관련 이벤트 : 1074 기존에는 아래와 블로그 글과 같은 해결 방법을 통해 자동 업데이트 차단이 가능했으나 이제는 불가능하다. https://igotit.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-10-%EC%9E%90%EB%8F%99%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EC%9E%90%EB%8F%99%EC%9E%AC%EB%B6%80%ED%8C%85-%EB%B0%A9%EC%A7%80-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0 Window 10 프로 홈서버 OS 자동 업데이트 방지 방법 업뎃 1. gpedit.msc 로 그룹 정책 편집기 열기 컴퓨터…

June 16, 2024
DevOps
Istio 클러스터에 가비아 Sectico SSL/TLS 인증서 설치하기

Let’s ecrypt를 활용해서 3개월 마다 istio의 tls인증서를 자동 갱신하도록 설정하는 방법도 있으나, 설정 과정이 다소 복잡하고 트러블 슈팅이 어려운 문제가 있었다. 그래서 결국 가비아를 통해 Sectico 인증서를 3년에 6만원 정도로 구입하여 적용하는 방법을 택했고, 이 방법이 대부분의 enterprise 환경에서도 사용되는 방법일 것이다. 1. TLS 인증서 준비 및 tls Secret 생성 가비아에서 Sectio 인증서를 나의 도메인으로 발급 받았고, 아래와 같이 4개 인증서를 제공 받았다. abc_company_root_cert.crt : 루트 인증서 파일 abc_company_chain_cert.crt : 체인 인증서 파일 abc_company.key: 도메인 인증서 파일 abc_company_cert.crt : 개인 키 파일 해당 파일 중 개인 키 파일 과 도메인 인증서 파일 2개를 사용하여 istio-system namespace에 tls secret을…

May 08, 2024
Troubleshoot
[Kotlin] 코드 제어하는 방법

제어문 If문, Expression 과 Statement 기본적인 if-else의 문법은 동일하다. Java에서 if-else는 Statement이지만 Kotlin에서는 expression이다. 즉 삼항연산자 처럼 값을 리턴할 수 있다. 따라서 삼항연산자가 없음 in 연산자를 활용 가능 switch 와 when switch case 문 대신에 when으로 kotlin에서는 대체되었으며 조건부를 다양하게 사용할 수 있다. image1 is 문, ..문 등 사용 와 같이도 쓸 수 있음 when뒤에 소괄호없이 바로 조건부와 결과로만 when절을 구성할 수도 있다. Enum 클래스, Sealed 클래스와 함께 사용할 경우 더욱 진가가 발휘된다. 반복문 for-each 문 ( 향상된 for문 ) ’:’ 대신 ‘in’을 쓰는 정도만 다르다. 전통적인 for문 in을 사용한여 범위를 표현한다. progression, range를 활용한 등차수열을 쓴다. downTo, step 등의 표현 예외 …

April 29, 2024
Java/Kotlin
[Kotlin] 객체지향 프로그래밍(OOP)

1. 클래스 클래스와 프로퍼티 생성자와 int 커스텀 getter, setter backing field 클래스와 프로퍼티 Java의 경우 : Kotlin의 경우 생성자가 classname 옆에 오지만 생략가능하며, 생성자에서 field를 선언할 수 있기 때문에 중괄호를 오히려 생략할 수 있다. val, var로 선언만하면 됨 getter, setter는 ’.’을 통해서 바로 참조 가능 생성자와 init kotlin에서는 java의 constructor에서 보통 작성하던 검증 로직을 init에서 할 수 있다. kotlin에서 주 생성자가 아닌 부 생성자는 클래스 내에서 constructor 키워드를 통해 구현되어야 한다. 주 생성자는 반드시 존재해야 하지만 파라미터가 하나도 없는 경우 생략 가능 부 생성저는 최종적으로 this(주생성자)를 호출해야 한다. 부 생성자에는 중괄호 block을 통해 코드를 삽입할 수 있다. 그러나 부 생성자는 일반적으로 사용되지 않고, 주로 defau…

April 25, 2024
Java/Kotlin
SPA 스터디 - Listen & Summarize

Listen & Summarize 전체 내용 파악하며 듣기 세부 사항 별로 키워드 2,3개 정도 기억하는 연습하기 문장 구성하기 1. Changes in life 주제 문장 만들기 This is a story about … This is about … The text/article decribes/explains .. (topic word) is … EX) 세부 문장 만들기 Detail 1 : 3 effect of mass production 기억하여 순차적으로 말하기 Detail 2 : 미국 뿐만이 아니라 세계적으로 영향 끼쳤음을 말하 모범 답안 : 2. Entertainment Key expressions latest social media 1.5 billion downloads, 500 million active monthly user creativity 16 - 24 age years old marketing and advertising haven 주제 문장 만들기 `T…

April 15, 2024
영어
RHCSA

1. root 비번 재설정 VM 재기동 ( ctrl-alt-delete ) rescue console ‘e’(edit) 로 진입하여 linux … 행에 추가 Ctrl-x로 저장하면 자동으로 레스큐 콘솔로 재부팅 된다. iui ]o[o[]]i][ ][i]i[][i] l[]o[]o] kkkk echo ‘anypass’ | passwd —stdin root 재부팅 시 파일 시스템의 SELinux 컨텍j스j트를 자동으로 재라벨링하도록 한다. touch /.autorelabel | ``` 2. 서버 네트웍 설정 x nmtui 명령을 통해 진입하는 콘솔에서 hostname, ip, gateway, dns server 등에 대한 설정 가능 3. 서버 리포지토리 관리 dnf repository 추가 4. SELinux SELinux의 http에 추가된 포트 확인 및 포트 추가 방화벽에 위에서 추가된 82번 port를 오픈하기 위해 추가 httpd 재시작 및 적용 5.논리 볼륨 크기 조정 -r…

March 25, 2024
Linux
DevOps
쿠버네티스 네트웍 내부구조

전체적인 쿠버네티스 네트웍 구조는 Service를 통해 pod를 노출시키되, service는 L4영역까지만 담당하고, L7의 역할을 하는 ingress를 Loadbalancer type service와 연결시켜서 사용하게 되는 구조이다. 멀티 노드 클러스터를 외부에 노출하기 위해서 Loadbalancer를 꼭 써야 하는 것은 아니다. 물론 그렇게 할 수도 있지만, 특정 워커 노드들에 ingressgateway를 고정으로 박아두고, nodePort로 오픈한 다음, 앞 단에 로드 밸런서를 두고 해당 node의 ip : port로 로드밸런싱되도록 설정할 수도 있다. rolling update 배포 모니터링 : watch -n 0.1 옵션 사용으로 실시간 확인 가능 롤백 k8s 네트웍 용어 NAT : 내부망을 위한 ip 주소로 변환 SNAT : 패킷이 내부에서 외부로 나갈 때 Source ip주소를 고정(public) ip로 변환 DNAT : 패킷이 외부에서 내부로 들어올 때 Destin…

March 05, 2024
Linux
DevOps
Docker 네트워크 구조

super user 권한 없이 docker 사용하기 docker에서 컨테이너 생성하고 내부로 들어가기 컨테이너란? 컨테이너는 독립된 리눅스 환경이다. 컨테이너는 단일 프로세스이다. Docker 구조 부모 프로세스가 1번인 daemon 프로세스의 형태로 dockerd는 구동된다. docker CLI 명령은 dockerd에 전달된다. 전달하는 방식은 /var/run/docker.sock containerd가 container runtime이며 /run/containerd/containerd.sock 을 통해서 dockerd와 통신한다. docker 컨테이너 내부에서 CLI명령을 사용하고자 하면 전체 컨테이너에 대한 정보를 dockerd를 통해서 알아내야 하기 때문에 호스트의 /var/run/docker.sock를 도커 컨테이너 내에서 참조할 수 있도록 마운트되어야 한다. dockerd, docker CLI 프로세스는 아래와 같이 tmpfs 파일 시스템 즉, 메모리에 올라간 doc…

February 27, 2024
Linux
클라우드
IPv4 네트워크 기본

네트워크 장비와 구조 라우터 L3: IP주소 기반으로 다른 네트워크와의 연결 장비 스위치 L2: 여러 컴퓨터 통신연결장비 (오류검사, 빠른 속도, 멀티포트 브릿지 ) 브릿지 L2: 컴퓨터와 컴퓨터간의 통신연결 장비로 허브보다 스마트하다. 브로드캐스트가 아니라 목적지 pc에 전달해준다. 허브 L2: 단순 브로드 캐스트를 하는 통신연결 장비 (‘깡통허브’)이며 실제로는 헙 잘 안쓰고 스위치를 많이 쓴다. IPv4 주소 32bit로 2^32승(약 42억개)의 ip 수용 가능 본래는 ip주소는 모든 host에 하나씩 할당 해주는 것이 목적이었으나 ip주소가 부족해짐. 그런데 어떻게 할당해주는가? 클래스 단위로 할당한다. A클래스는 8bit, B클래스는 16bit, C클래스는 24bit을 네트웍 주소로 사용하고, 나머지 bit을 host주소에 할당해준다. 그러나 클래스 방식으로 ip를 할당하는 방식은 A~C클래스 사이에서 애매한 부분이 있어 비효율이 발생하므로 이제는 CIDR 방식…

February 21, 2024
Linux
리눅스VFS와 네트워크와 네트웍 도구

리눅스 VFS systemcall 중 가장 많이 쓰이는 것은 open, read, write이다. 리눅스에서는 모든 자원을 VFS를 통해 파일처럼 쓰고 읽을 수 있게 되어 있기 떄문이다. file들이 반드시 ssd,hdd에 저장된게 아니라 메모리에 연결된 것들도 있고, 네트웍도 파일이다. df -h 했을 때 Filesystem이 tmpfs로 나오는 건 메모리에 연결된 것이며, /run 디렉토리가 이에 해당함을 확인할 수 있다. /proc 하위에 있는 파일들도 procfs라는 Filesystem을 사용하며 이는 커널이 메모리에 동적으로 데이터를 저장한다. 리눅스 네트워크 도구 hping3 명령어 hping3의 옵션을 사용하여 다양한 테스트 가능 fast faster flood : 보낼 수 있는 만큼 응답기다리지 않고 많이 보내기 (ddos공격 시 활용 가능) iptables 명령어 blacklist 관리 가능 3번째 단계에서 hping3 패킷을 보낼 떄 규칙이 설정되어 있으면 …

February 07, 2024
Linux
MTU와 MSS 이해와 실습

MSS란? L4계층의 개념이며 Maximum segment size의 약자로서 TCP에서 전송할 수 있는 사용자 payload 크기 TCP header를 제외한 payload만의 크기이다. 그리고 payload는 각 네트웍 계층에 따라 상대적인 개념이다. (ex. L4에서는 http 헤더가 payload. L3에서는 tcp헤더도 payload) 그리고 전 layer에 걸쳐서 ethernet frame을 포함하여 패킷은 sk_buff 구조체로 리눅스 커널 내부에서는 관리된다. MSS는 말 그대로 최대치를 의미하며 이것 보다 큰 데이터는 fragment로 조각을 내서 전송한다. MTU란? L3계층의 개념이며 Maximum Transmission Unit의 약자로서 네트욱에서 전송할 수 있는 최대 패킷 크기이다. 라우터 마다 이 설정이 다를 수 있다. 예컨대 내 PC는 1000byte가 MTU여서 1000byte를 보냈더라도 중간에 어떤 라우터의 MTU가 700이면 패킷을 쪼개서…

January 31, 2024
Linux
Write, Read 소켓 버퍼 커널 설정

네트워크 소켓 메모리 공간을 결정하는 커널 설정 kernel parameter를 runtime에 설정할 수 있게 해주는 sysctl 명령 활용 net.core.*는 tcp,icmp등 프로토콜 관계없이 모든 통신과 관련한 설정 net.ipv4.tcp.* 는 tcp관련 소켓 메모리 설정 값이다. 이들 설정값의 단위는 다 byte단위가 아니라 어떤건 page단위(보통 4kb), 어떤 건 byte단위이다. 첫 번째 그림에서 보면 tcp 메모리 관련해서 하나의 값만 있는게 아니라 3개의 값이 존재한다. 이것은 min, pressure, max 수치이다. 커널을 pressure모드로 설정할 수가 있는데, 커널 내부적으로 tcp에서 메모리를 사용할 때 메모리 할당 전에 pressure모드인지 아닌지를 체크한다. pressure mode이면 pressure수치를 사용한다. 커널이 pressure모드이면 리소스 활용을 최소화하고 안 쓰는 메모리 공간을 여유 메모리공간으로 할당하는 등 리소스를…

January 31, 2024
Linux
리눅스 네트워크 I/O 분석

네트워크 I/O 과정 ESTABLISHED 그 이후.. Client와 Server는 서로 데이터 패킷을 주고 받게 된다. 송신 측에서 socker 버퍼에 패킷을 집어넣는다. 패킷이 목적지에 도착하면 목적지인 수신 측 컴퓨터는 하드웨어 디바이스들이 직접 접근할 수 있는 메모리의 DMA 영역에 패킷을 저장한 이후에, CPU에 irq(interrupt 요청)를 보내서 패킷이 도착함을 알린다. hard irq, soft irq 과정 ( hi, si ) hard irq에서는 간단한 작업만을 하게 된다. interrupt를 통해 CPU를 깨우고, ISR이 해당 인터럽트에 대한 처리를 하게 함과 동시에 network stack에 event를 발생시켜 수신된 패킷이 있음을 알린다. (+flag set 정도) soft irq는 네트웍 스택에 의해 스케줄링 되며 스케줄에 따라 CPU가 soft interrupt handler를 실행시켜 수신된 패킷을 처리한다. 수신한 패킷 파싱, 헤더 분석, 검증…

January 25, 2024
Linux
TCP/IP 통신과정 추적

TCP란? Transmission Control Protocol L4 계층 통신 TCP의 가장 중요한 키워드는 “커넥션”이다. 통신 전에 커넥션을 맺고 통신이 끝나면 커넥션을 해지한다. HTTP 통신을 할 때도 TCP/IP 통신을 기반으로 한다. TCP 통신의 과정 연결 : 3 way handshaking 데이터가 없는 Ethernet header, IP header, TCP Header로만 이루어진 SYN 패킷을 보낸다. 이 떄 TCP Header에 SYN으로 표시되어 있다. 그 이후의 SYN,ACK 와 ACK 패킷도 마찬가지이다. 데이터 통신 HTTP 통신이라고 가정하면, HTTP 헤더/바디를 포함한 message 데이터가 추가된 데이터 패킷을 주고 받는다. 해지 : 4 way handshaking 해지도 연결과 마찬가지로 데이터가 없는 FIN, ACK 패킷을 주고받음으로써 연결을 해지한다. L7의 프로토콜에 따라 다르지만 데이터 통신이 오고가는 과정에서 계속 3 way …

January 23, 2024
Linux
라우팅 추적(ICMP)과 ARP

네트워크 통신과정 : 라우팅 추적 traceroute 중간에 보이는 * 은 보안, 설정, 부하 등으로 인해 응답이 없었던 라우터이다. 처음에 LAN의 gateway를 타고 나가서 router들을 거쳐 목적 서버로 도착하게 된다. 동일 hop에 여러개의 ip가 나타나는 것은 여러 개의 경로가 있을 수 있음을 의미한다. ICMP란? Internet Control Message Protocol L3 통신이다. (TCP통신이 아님에 유의) 라우터를 포함한 네트웍 장치가 통신 체크 용도로 사용된다. ping tshark 설치하기 -f, -Y옵션은 패킷 filtering을 위해 사용되며 -f는 protocol을 필터링하고, -Y 뒤에는 표현식을 적어주어 필터링한다. ARP란? Address Resolution Protocol L2(데이터링크 계층) 통신 IP주소를 MAC주소에 매핑하기 위하여 사용된다. 최종 목적지의 MAC주소를 이더넷 프레임에 포함하지는 않는다. (목적지가 LAN내라면 그럴…

January 21, 2024
Linux
리눅스 네트워크 처리와 http통신

리눅스의 네트워크 처리 리눅스 OS는 네트워크 카드를 포함한 하드웨어를 관리하는 역할을 한다. OS 위에서 실행되는 application이 하드웨어(여기선 네트웍) 사용하기 위해서는 Linux kernel에 systemcall을 보내야 하고, 가장 많이 open, read, write와 같은 systemcall이 사용된다. 네트웍 자원을 사용할 때는 open대신 socket이라는 systemcall을 사용하게 되며 read 명령은 receive, write명령은 send의 역할을 하게 된다. 이외에도 네트워크 처리함수들은 Linux kernel에 내장되어 있다. L2~L4의 처리를 리눅스의 네트웍 함수들을 사용하여 소프트웨어적으로 처리할 수도 있지만 하드웨어에 내장된 기능을 통해 ‘하드웨어 오프로드’로 더 빨리 처리할수도 있다. Ethernet frame에서 붙는 mac주소의 destination은 내부망(LAN)에서는 실제 목적지 컴퓨터의 mac주소가 맞지만, WAN에…

January 19, 2024
Linux
[기술 세미나] 리눅스 패키지 문제해결 사례 핵심분석

문제란 무엇인가? 문제란 목표와 현 상황의 차이(Gap)이다. 따라서 단순히 에러 메시지가 어떻다에서 그치지 않고 목표를 정확하게 잘 정의하는 것이 중요하다. 문제 해결의 다양한 접근 방법 1 : “문제의 현상과 원인은 다르다” 예를 들어 보자. 문제의 현상 : 파일 생성 오류 파일 생성 오류가 나는 것은 root cause가 아니라 현상이다. 따라서 이에 대한 원인을 하나씩 찾아나가는 것이 중요하다. 문제 해결의 다양한 접근 방법 2 : “잘게 쪼개고 구체화하라” 절차, 단계, 열거, 관찰, 점검을 통해 문제를 해결한다. 리눅스 / 네트웍이 어떻게 원래 돌아가는 지 알아야 절차와 단계, 열거를 할 수 있다. 이게 가능하기 위해서는 2~3 depth까지는 현상 뿐만이 아니라 원리(왜 되는지?) 에 대해서 알아야 한다. 문제 해결의 다양한 접근 방법 3 : “연역적 접근 vs 귀납적 접근” 연역적 접근 방식 만으로는 변수와 예외가 너무 많기에 해결이 안될 수도 있다. 따라서 경험을…

December 15, 2023
DevOps
Linux
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 마무리

Part5-1까지 잘 정리하다가 갑자기 책의 마무리다.. 사실 Part6에서8은 실제 사역에 대한 부분이라 읽으면서도 나로서는 크게 와 닿는 내용은 없었고, 함께 하는 사람들도 비슷한 느낌을 공유했던 것 같다. 그래서 목사님께 Part6~8에 대한 마무리 강의를 요청했고 간단한 나눔, 그리고 목사님의 간증, 비전 ( ? ) 같은 생각을 들었다. 들으면서 들었던 생각은 목사님의 비전은 정말 크고 길다는 것, 그리고 그렇기에 시광교회는 아직도 갈 길이 멀며 나는 그 속에서 무엇을 할 수 있을까라는 생각이었다. 왼쪽에 있는 모델들은 문화에 참여하고 변혁하려는 시도들이 혼합주의와 타협으로 연결된다고 생각하며, 따라서 그리스도인들에게 문화를 변화시키기 보다는 “교회가 되라”라고 요구한다. 오른쪽에 있는 모델들이 왼쪽에 있는 모델을 바라볼 때 ‘이원론과 도피’ 라고 비판할 수 있다. 그림의 아래쪽에 위치한 모델들은 일반 은총을 그다지 믿지 않고 세상과 하나님 나라의 가치간에 근본적 차이가 있…

December 15, 2023
독서
[AEM] Training course

1. AEM Core Technology의 구성 Apache Sling OSGI Felix application runtime JCR content repository 2. OSGI Felix application runtime OSGI 주요 콘솔은 아래와 같다. 콘솔 콘솔 콘솔 모든 bundle은 서로 간의 dependency를 가지며, apache felix가 가장 root인 (id=0) bundle이다. 해당 콘솔에서는 bundle간의 의존 관계를 파악할 수 있다. 하위의 bundle이 죽게 되면 거기에 의존하고 있는 상위의 bundle도 malfunction하게 된다. 이는 트러블슈팅 시에 중요한 개념이다. 3. 데이터 저장 방식 데이터 저장 시 현대기아는 tarMK 방식 사용 (서버의 repository 폴더), Cluster 방식에서는 mmongoDB, AWS s3, Azure blob storage등을 활용할 수도 있다. 4. Reusability AEM에는 Re…

December 09, 2023
WEB
[AEM] Training course

1. AEM Core Technology의 구성 Apache Sling OSGI Felix application runtime JCR content repository 2. OSGI Felix application runtime OSGI 주요 콘솔은 아래와 같다. 콘솔 콘솔 콘솔 모든 bundle은 서로 간의 dependency를 가지며, apache felix가 가장 root인 (id=0) bundle이다. 해당 콘솔에서는 bundle간의 의존 관계를 파악할 수 있다. 하위의 bundle이 죽게 되면 거기에 의존하고 있는 상위의 bundle도 malfunction하게 된다. 이는 트러블슈팅 시에 중요한 개념이다. 3. 데이터 저장 방식 데이터 저장 시 현대기아는 tarMK 방식 사용 (서버의 repository 폴더), Cluster 방식에서는 mmongoDB, AWS s3, Azure blob storage등을 활용할 수도 있다. 4. Reusability AEM에는 Re…

December 09, 2023
WEB
[온유] 앱 개발&운영 회고

1. 온유 앱을 시작하고 출시하기 까지 2. 배운 점 ( Liked, Learned ) 기술적 요소 협업적 요소 기획적 요소 3. 아쉬웠던 점 ( Lacked ) 기술적 요소 ( 기술 부채와 개선점 ) 기획적 요소 4. 앞으로의 기대 ( Longed for ) 앱 스토어 링크

December 01, 2023
회고
[Error] Redis 기동 실패 : SELinux

VM이 갑자기 재기동 되어 k8s 클러스터를 복구하였으나, redis가 재기동되지 않아서 명령으로 로그를 확인해보니 와 같은 오류가 출력되었다. 이는 SELinux의 audit 정책과 관련된 이슈이고, SELinux 정책을 off했다가 redis 재기동 후 on을 하는 방식으로 해결하였다. 정책 off 정책 on

November 22, 2023
Error
[Kotlin] 코드 제어하는 방법

제어문 If문, Expression 과 Statement 기본적인 if-else의 문법은 동일하다. Java에서 if-else는 Statement이지만 Kotlin에서는 expression이다. 즉 삼항연산자 처럼 값을 리턴할 수 있다. 따라서 삼항연산자가 없음 in 연산자를 활용 가능 switch 와 when switch case 문 대신에 when으로 kotlin에서는 대체되었으며 조건부를 다양하게 사용할 수 있다. is 문, ..문 등 사용 와 같이도 쓸 수 있음 when뒤에 소괄호없이 바로 조건부와 결과로만 when절을 구성할 수도 있다. Enum 클래스, Sealed 클래스와 함께 사용할 경우 더욱 진가가 발휘된다. 반복문 for-each 문 ( 향상된 for문 ) ’:’ 대신 ‘in’을 쓰는 정도만 다르다. 전통적인 for문 in을 사용한여 범위를 표현한다. progression, range를 활용한 등차수열을 쓴다. downTo, step 등의 표현 예외 try ca…

November 18, 2023
Java/Kotlin
[Kotlin] 변수, 타입, 연산자

변수 var과 val 자바에서는 불변해야 하는 변수에 final과 같은 키워드를 사용하지만, 코틀린에서는 변수에는 var, 상수에는 val을 사용한다. 자동 타입 추론 그러나 초기화를 하지 않고 선언만 하는 경우에는 명시적으로 type을 줘야 한다. 선언과 초기화 val 컬렉션에 element를 추가할 수 있다. 모든 변수를 우선 val로 만들고 꼭 필요한 경우만 var로 선언한다. 자바의 long / Long 과 같은 구분이 없고 그냥 하나로 통일된다. 즉 primitive type, reference type의 구분이 따로 없고 boxing과 unboxing을 고려하지 않아도 되도록 kotlin이 내부적으로 알아서 처리한다. nullable 자바는 Reference type은 null이 할당될 수 있지만 kotlin에서는 null이 들어갈 수 있는 변수라면 ‘타입?‘를 사용함으로써 구분한다. 객체의 인스턴스화를 할 때 ‘new’ 키워드를 사용하지 않는다. Null Kotlin에…

November 17, 2023
Java/Kotlin
[CKS] Realexam

TLS 관련 문제 바로 스킵 Falco 문제는 배점이 11점이었는데 falco에서 아무 로그가 안 잡혀서 못품;; 무슨 image scanner 관련된 문제가 있었는데 (kubesec아니고,,) 못품. 아마 admission controller, webhook 관련 문제였던 것 같다. kubelet에서 authorization mode를 alwaysAllow로 되어 있던 걸 Webhook으로 수정했어야 하는데 kubernetes.io에 레퍼런스를 못찾아서 ‘Deny’라고 잘못 품 도큐먼트에서 ‘kubelet’으로 검색하니깐 찾을 수 있음.

November 15, 2023
DevOps
[CKS] Killer shell

Q1. You have access to multiple clusters from your main terminal through kubectl contexts. Write all context names into /opt/course/1/contexts, one per line. From the kubeconfig extract the certificate of user restricted@infra-prod and write it decoded to /opt/course/1/cert. Q1 정답 File /opt/course/1/contexts 가 모든 context를 포함하고 있는가 File /opt/course/1/cert 가 cert를 포함하고 있는가 kubeconfig 파일의 cluster가 아닌 restricted@infra-prod의 user 의 cert내용을 base64 -d로 디코드하여 /opt/course/1/cert에 저장 Q2 Falco is installe…

November 14, 2023
DevOps
[CKS] Mockexam 3

EXAM 2 Q1 Q1 Answer 에서 아래 2가지 사항 조치 수정 추가 Q2 Q2 Answer /etc/kubernetes/prod-audit.yaml 작성 kube-apiserver 설정 kube-apiserver volume / volumeMounts 설정 volumes volumeMounts Q3 : kubesec문제로 Pass~ Q4 Q4 Answer dev-write role 추가 developer sa 추가 kubectl create sa developer -n dev dev-write-binding rolebinding 추가 에서 serviceAccount developer로 수정 Q5 (OPA) / 중요! Q5 Answer configmap에 정의된 rego file을 살펴보면 로 시작하지 않는 repository를 거부하는 설정을 가지고 있다. 따라서 이미지 url을 아래와 같이 고친 후에 pod를 기동해주면 된다. Q6 Q6 Answer admission …

November 12, 2023
DevOps
[CKS] Mockexam 2

EXAM 2 Q1 Q1 Answer namespaceSelector 에서는 metadata.namspace의 동일한 namespace에 대한 것은 설정할 필요 없고, 다른 namespace에서 접근하고자 하는 경우에만 namespaceSelector를 적용한다. namespace에 대한 selector는 label 한 쌍으로 충분하지만, podSelector에서는 pod의 모든 label에 대해서 일치하도록 규칙을 설정하여야 한다. Q2 Q2 Answer 나의 답안은 아래와 같았으나 틀린 이유는 network policy에서 규칙을 정의할 때, 모든 label이 일치하도록 설정해야 하므로 위와 같이 하는 것이 옳다. Q3 Q3 Answer automountServiceAccountToken: false 필드를 pod에 추가 이 옵션을 추가해주면 serviceaccount token secret이 pod의 경로에 마운트 되지 않게 해준다. Q4 Q4 Answer /etc/falco…

November 11, 2023
DevOps
[CKS] 모니터링/로깅, 런타임 보안

Falco 아무리 보안이 강한 클러스터를 구축하여도 막상 공격 받았을 때는 어떻게 대처애햐 하는가? strace, Tracee 와 같은 툴로 application에서 사용된 syscall을 분석할 수 있지만 MSA 환경에서 수백개의 pod가 수만 개의 syscall을 생상하고 있는 환경에서 이를 일일히 분석하는 것은 쉬운 일이 아니다. 대신 Faclo를 활용하면 /etc/shadow 에 접근한다거나 log파일을 편집/삭제 하는 등의 의심스러운 행동을 Falco가 모니터링 해준다. Falco Architecture Falco Kernel module을 허용하지 않는 Provider도 있어서 Aquasec tracee처럼 eBPF를 활용하기도 한다. Syscall은 Falco module에 의해 감지되고 나서 library에서 분석되고 predefined된 Falco rule을 활용하여 policy engine에 의해 의심스러운 syscall인지 필터링된다. output/alert …

November 01, 2023
DevOps
[CKS] Mockexam 1

EXAM 1 Q1 Q1 Answer AppAromor profile 로드하기 profile 이름으로 정상 로드 확인하기 default sa를 제외하고 가장 권한이 적은 sa를 frontend-site pod에서 적용하도록 설정 Q2 Q2 Answer Q3 Q3 Answer trivy image 명령어를 이용해 실행 중인 pod 중에 가장 vulnerability가 적은 image를 실행하고 있는 pod만 남기고 모두 삭제하기 Q4 Q4 Answer mv /root/CKS/audit.json /var/lib/kubelet/seccomp/profiles Seccomp 적용하여 pod replace하기 Q5 The CIS Benchmark report for the Controller Manager and Scheduler is available at the tab called CIS Report 1. Report 내용: [FAIL] 1.1.12 Ensure that the etcd …

November 01, 2023
DevOps
[CKS] Cheatsheet: CKS 시험 필수 명령어

Container 활용 kubectl Resoruce API Version 확인 : kubectl api-resources Resource Spec/Status 확인 : kubectl explain –recursive {resource} AppArmor Profile 적용 : apparmor_parser {profile_path} Profile 확인 : aa-status | grep {profile_name} kubesec Resource 검사 : kubesec scan {resource} Trivy Image 검사 : trivy image –severity {UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL} {image_name} Tar Image 검사 : trivy image –severity {UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL} –input {image_tar} Falco & Sysdig Falco Falco 시작 : systemctl st…

November 01, 2023
DevOps
[CKS] Supply chain 보안

Base image footpring 최소화하기 base image란 무엇인가? dockerfile의 절에서 명시하는 이미지는 parent 이미지이다. 가령 아래 예시에서 보는 것처럼 httpd 이미지는 debian이라는 이미지를 parent로 가진다. 그리고 debian 이미지는 로 부터 생성되는데, 이렇게 scratch로 부터 생성되는 이미지를 base 이미지라고 하는데, parent 이미지라는 의미로 혼용되기도 한다. Modularize : 각각의 이미지는 여러 기능을 하지않고 1개의 주요 역할만 하도록 모듈화되어야 한다. Persist state : 데이터/state을 컨테이너내에 보관하지 않는다. ‘Official image’ 사용하기 이미지를 최소화하기 yum, wget, curl 과 같이 공격자가 활용할 수 있는 명령어들을 image에 포함시키지 않아야 한다. production 이미지와 dev/stg 이미지는 분리되어야 한다. 결국, 이미지에는 applicati…

October 31, 2023
DevOps
Informatica 1

PowerCenter 개요

October 19, 2023
Data
[CKS] Microservice 취약성

Security context 컨테이너를 실행할 때 하기와 같이 어떤 유저로 실행할지, 어떤 capability를 추가하거나 뺼 지 등 보안 설정을 할 수 있다. 이는 k8s pod definition에서도 Security context 절을 통해 설정할 수 있는데, pod 레벨에서 설정하면 pod 내의 모든 컨테이너에 적용되고 컨테이너 레벨에서 설정을 하면 그 설정으로 override된다. Pod 레벨 예시 Container 레벨 예시 명령을 통해 특정 pod를 실행시키고 있는 user가 무엇인지 알 수 있다. Admission controller admission controller는 authentication/authorization 단계에서 수행할 수 없는 보안조치를 위한 부가적인 기능들을 제공한다. NamespaceExists와 같은 모듈은 디폴트로 적용되어 있어서 pod가 생성될 namespace가 실제 존재하는지 체크하고, NamespaceAutoProvisio…

October 15, 2023
DevOps
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week9

Part4. 도시 비전: 복음으로 도시를 품으라 Part5. 문화 참여: 교회, 도시 문화를 이끌라 4-4. 도시, 복음으로 옷입다. 교회들이 어떻게 도시 비전을 갖고 도시의 역동성에 대응하여 사역할 것인가? 도시는 어떻게 우리에게 영향을 미치는가 도시의 집적화로 인한 역동성은 경제/예술/기술 등 다양한 분야에 영향을 끼친다. 도시의 그리스도인들은 이러한 역동성 안에서 비그리스도인들로부터 많은 것을 배우게 된다. 따라서 우리는 그들을 불쌍히 여기는 것이 아니라 존경하며 겸손히 배워야 한다. 그리스도께서 완벽한 타인인 우리를 위해 죽으셨음을 기억하라 도시 속에서 복음은 우리에게 겸손함을 주고, 자신감을 주고, 용기를 준다. 그리고 이를 통해 하나님을 영화롭게 하고 타인을 축복할 수 있게 된다. 우리의 영적인 발전과 행복을 위해 우리는 도시가 필요하다. 그리스도인들은 도시를 위해 무엇을 할 수 있나? 혹자는 도시에서 신앙을 잃을 가능성이 크다고 말하지만, 획일적이고 덜 다원적 환경에서…

October 12, 2023
독서
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week8

Part4. 도시 비전: 복음으로 도시를 품으라 4-2. 도시는 구속되어야 한다. 앞 장에서 하나님은 바벨론이라는 유배지에서 유배자로 살아가는 이스라엘 백성들에게 이방 도시를 섬기라는 명령을 하신다. 이 장에서는 ‘유배 모델’이 신약시대와 현 시대의 교회와 도시의 관계를 이해하는 데 어떻게 도움을 주는지 살펴본다. 그리스도인 교회와 유대인 유배자의 공통점 하나님 백성으로서의 정체성을 상실하지 않으면서도 도시의 긴장을 받아들이고 포용한다. 선한 행실을 통해 이방인들이 하나님께 영광을 돌리게 해야한다. 그리스도인 교회와 유대인 유배자의 차이점 유대인들은 생물학적인 방법을 통해 번성해야 했다. 그러나 교회는 전도와 제자 삼는 사역을 통해서도 번성해야 한다. 이러한 선교적 부르심에서도 중요한 차이가 있는데 구약은 ‘구심적’, 신약의 선교는 ‘원심적’ 이라는 점이다. 유대인들은 바벨론 사회에 참여하면서도 모세의 법과 그들의 관습을 지켰다. 그러나 오늘날의 교회는 도시 문화에 참여할 자유를 …

October 12, 2023
독서
[CKS] System Hardening 2

System Hardening 섹션에서는 하기의 내용들에 대해 다룬다. host OS foorprint 최소화 Node 접근 제한 SSH hardening Linux privilege escalation 불필요 패키지/서비스 제거 커널 모듈 제한 오픈 포트 제한 IAM role UFW 방화벽 Seccomp AppArmor 7. IAM role public cloud의 IAM policy, role을 최소화해야 한다. IAM user 관련 권한 관리는 group 활용하여 IAM policy를 그룹에 부여한다. IAM service 관련 관한 관리는 IAM policy를 service(ec2같은) 에 직접 부여할 수 없기에 IAM role을 활용한다. S3BucketAccessRole과 같은 role을 만들고 IAM policy를 해당 role에 부여한다. 그리고 이 role을 ec2에 부여한다. 8. UFW 방화벽/네트워크 네트웍 외부 접속의 최소화 앞서 보았듯, /etc/servi…

October 09, 2023
DevOps
[CKS] System Hardening 1

System Hardening 섹션에서는 하기의 내용들에 대해 다룬다. host OS foorprint 최소화 Node 접근 제한 SSH hardening Linux privilege escalation 불필요 패키지/서비스 제거 커널 모듈 제한 오픈 포트 제한 IAM role UFW 방화벽 Seccomp AppArmor Least privilege principal : 각 모듈은 필요한 최소한의 권한만을 지녀야 한다는 원칙으로, 리눅스, k8s를 포함한 모든 컴퓨터 시스템에 적용되는 원칙이며 k8s에서는 아래와 같은 작업에 충실함으로써 이 원칙을 지키게 된다. 노드 접근 제한 RBAC 불필요 패키지/서비스 제거 네트웍 접근 제한 불필요 커널 모듈 제거 오픈 포트 제한 Host OS foorprint 최소화 곧, attack surface를 최소화하는 것이다. 1. 노드 접근 제한 인터넷 접근이 안되는 환경을 택하고, VPN과 같은 솔루션을 통해 내부망에 접근하게 한다. 방화벽에서…

October 09, 2023
DevOps
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week7

Part3. 복음의 상황화: 복음이 현실에 다가서게 하라 Part4. 도시 비전: 복음으로 도시를 품으라 3-4. 도시 속으로 적극적으로 들어가라 적극적인 상황화는 세 가지 과정을 거친다. 문화 속에 들어가는 것 문화에 맞서는 것 청자에 호소하는 것 문화 속에 들어가 적응하기 청중을 이해하고 그들과 공감대를 형성해야 한다. 문화가 던지는 질문, 희망, 신념들 속으로 들어가는 것이 상황화의 첫 번째 작업이다. 웨스트민스터 신앙고백서는 17세기 영국인들에 의해 만들어졌기에 20세기 한국인들이 궁금한 질문들에 대한 내용을 담지 못했던 것을 생각해보자. 지역에 있는 사람들의 삶을 이해하고 그들의 목회적 필요를 깨닫게 되는 것이 가장 중요하다. 복음을 상황화해서 전달할 때 3가지 논증의 방식 개념적 논증 : 논리적 전제와 분석 등이 설득력을 지닌다. 구체적/관계적 논증 : 어떤 원리가 어떻게 실제로 삶에 작동되는 지가 설득력을 지닌다. 직관적 논증 : 이야기와 서사가 설득력을 지닌다. A신…

October 02, 2023
독서
[CKS] Cluster setup & hardening 2

KubeConfig ~/.kube/config 에 config 파일로서 certification 에 대한 경로 등을 저장하는 것을 통해 kubectl 시 별도의 인증서 명시 또는 apiserver에 대한 주소 명시 등을 할 필요가 없게 된다. KubeConfig 파일은 세 부분으로 구성된다. Cluster Contexts : Context는 어떤 유저가 어떤 Cluster를 사용할 것인지에 대해 정의한다. Users API Groups 아래 명령을 통해 어떤 리소스가 어떤 API Group에 속했는지 확인 가능하다. RBAC에서 리소스에 대한 apiGroup을 명시해야 하는데, 이 때 아래 명령을 활용하여 참고하면 좋다. 또한 어떤 리소스가 namespace에 국한되지 않는 cluster 리소스인지도 확이할 수 있다. Authorization Node Authorizor kubelet과 같이 system:node:node01 ‘system:node’라는 이름이 client ce…

September 26, 2023
DevOps
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week6

Part3. 복음의 상황화: 복음이 현실에 다가서게 하라 3. 반드시 성경적이어야 한다. 성경적인 상황화를 위해 로마서1~2장, 고린도전서 9장, 고린도전서 1장을 살펴보자. 로마서에 나타난 문화의 복합적 성격 문화는 사회로 하여금 그 가치를 위해 섬기고 헌신하도록 하기 때문에 모든 문화 작업은 ‘언약적’이라고 볼 수 있다. 이방인들은 감각을 우상으로 삼았고, 유대인들은 정신적 의로움을 우상으로 삼았다. 그리고 그것을 의지하여 자신들을 정당화하고 구원하려 했다. 로마서 1장은 ‘일반 계시’ 에 대해서 말해준다. 비그리스도인들의 그들의 잘못된 세계관에도 불구하고 도덕의 실천, 지혜, 예술, 기술 등에 있어서 뛰어날 수 있는 이유가 여기에 있다. 인간 문화에 대한 관점은 비판적 향유와 적절한 경계가 함께 가야 한다. 나님의 형상에 대한 이해 복음에 대한 일관적이고 성경적인 이해는 문화에 대한 설득력 있는 지식을 제공하여 상황화의 기초가 된다. 하나님의 형상에 대한 이해 일반 계시(은총…

September 21, 2023
독서
[CKS] Cluster setup & hardening 1

Cloud Native 보안의 4C Cloud : Datacenter, network, servers Cluster : Auth, Admission, NP Container : Restrict image, supply chain, sandboxing, privileged Code : Code security CIS Benchmark CIS는 커뮤니티 기반의 오픈소스 단체로서 세상의 사이버 보안을 향상하는 데 기여한다. CIS는 k8s 뿐만 아니라 다양한 IT 표준 기술들( web, was, db, OS, network )에 대해서 보안에 대한 best practice를 제공한다. CIS-CAT을 사용하면 현재 k8s 클러스터의 취약점을 html로 생성해준다. 그러나 CIS-CAT pro만 k8s assessment를 지원하며 유료이다. Lab : CIS benchmark on Ubuntu OS (CIS-CAT) CIS-CAT 실행 OS 선택 Ubuntu 20.04 LTS Prof…

September 16, 2023
DevOps
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week5

Part3. 복음의 상황화: 복음이 현실에 다가서게 하라 1. 도시에서는 복음화가 어렵다? 시골 혹은 도시 외곽에서는 교회가 번창하지만 도심에서 복음의 열매를 맺기 어려운 경우가 많다. 이를 극복하기 위해 ‘상황화’ 가 필요하다. 건전한 상황화 상황화는 사람들에게 그들이 원하는 것을 주는 것이 아니다. 오려 ‘특정 시기와 특정 지역에서 사람들이 삶에 대해 갖는 질문에 대해 그들이 이해할 수 있는 언어와 형태로, 그리고 그들이 힘 있게 느낄 수 있는 호소와 논증을 통해서 그들이 심지어 반대하더라도 성경의 답을 제시하는 것이다.’ 상황화된 복음은 명료하면서도 매력적이다. 문화에 연결되어 있지만 그 문화와 맞서 도전하는 것이다. 따라서 상황화를 잘하려면 문화에 대한 이해가 있어야 한다. 문화는 시간에 대한 이해, 갈등 해결, 문제 해결, 사고하는 방법에 까지 영향을 미친다. 상황화는 단순히 성경 교리의 실천적인 적용이 아니라 우리가 살아가고 있는 삶에서 지배적 힘을 발휘하는 사회적 구조…

September 14, 2023
독서
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week4

Part2. 복음 부흥: 복음 중심적 부흥을 준비하라 3. 부흥이 사역을 만든다. 어떻게 교회가 성령과 동역하여 부흥을 일으킬 수 있는가? 복음 부흥의 수단들 성령께서는 몇 가지 수단을 사용하여 부흥을 일으키신다. 1. 각별한 기도 (Extraordinary prayer) 연합해서 지속적으로 하나님 나라를 중심으로 드리는 기도이다. 이것은 한 사람이나 작은 그룹이 모여서 공동체 가운데 하나님의 영광을 구할 때 시작된다. 죄를 고백하고 하나님을 알고자 하는 기도 2. 복음의 재발견 거듭남과 은혜를 통한 구원에 대한 특별한 강조가 필요하머 이런 메시지를 통해 사람들이 복음을 재 발견할 때 그들의 삶에 변화가 일어난다. 3. 복음의 적용 그리스도 중심적 설교를 하되, 예수님에 대한 동기를 부여하거나 인생에 대한 성경적 원리를 강해하는 것이 아니라 ‘그리스도의 구원’ 에 대해 설교할 때 부흥에 다가설 수 있다. 복음을 다른 이들에게 가르칠 수 있는 평신도 리더들을 훈련시키는 것 소그룹 사…

September 07, 2023
독서
[HTTP 스터디] 3. HTTP 헤더

1. HTTP 일반 헤더 헤더에는 http 전송을 위해 필요한 모든 부가 정보를 담는다. 메시지 바디 내용, 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등.. RFC2616에서 RFC723x로 변화 entity 대신 representation으로 개념이 바뀜 표현 = 표현 메타 데이터 + 표현 데이터 표현 표현 헤더는, request, response 모두 사용한다. Content-Type test/html; charset=UTF-8 application/json image/png Content-Encoding 표현 데이터를 압축하기 위해 주로 사용 gzip, deflate, identity Content-Language 자연 언어 표현 ko, en, en-US Content-Length 바이트 단위 Transfer-Encoding 을 사용하면 Content-Length 사용하면 안됨 콘텐츠 협상(contents negotiation) 협상 헤더는 클라언트…

August 30, 2023
WEB
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week3

Part2. 복음 부흥: 복음 중심적 부흥을 준비하라 1. 이 시대에도 정말 부흥이 필요하다. 공동체적 복음 회복이 종종 ‘부흥’이라고 불린다. 부흥은 성령께서 일하셔서 인간의 그릇되고 고질적인 사고 체계인 자기의와 부채 의식 등을 몰아내고 깨뜨리시는 지속적인 활동이다. 부흥에 대한 비판과 부흥주의의 위험성 부흥주의에 대한 비판 부흥주의자들은 전통과 교리, 교회중심 보다는 개인의 결단과 개인의 급격한 회심의 경험을 강조하였다. 교리적 건전함과 삶의 거룩함보다 감정적 체험이 더 중요시 되었다. 이렇듯 비판적이었던 스프레이그와 같은 사람과 달리 아치볼드 알렉산더 교수는 부흥의 부정적 영향을 부흥 자체의 문제로 보지 않고, 부흥과 교회중심을 함께 가야할 것으로 보았다. 오늘날의 부흥주의 오늘날 부흥주의가 감정적, 체험중심적이라는 단점이 존재하지만 복음 부흥 사역에 대한 기본적 통찰과 실행은 2가지 이유에서 옳다. 오늘날 부흥은 우리 시대에 적합한 측면이 있기 때문이다. 예전과 달리 기독…

August 23, 2023
독서
[HTTP 스터디] 2. http 메소드와 상태코드

1. HTTP 메소드 API URI에 대한 고민 API URI를 고민할 떄 가장 중요한 기준은 ‘리소스의 식별’ 이다. ex) 회원을 조회한다고 할 때 ‘회원’ 자체가 리소스이다. 따라서 URI에 ‘회원’을 매핑 해주어야 한다. 리소스는 ‘복수형’으로 사용한다. ex) members(O), member(x) 리소스와 행위를 구분한다. 행위는 http 메소드를 통해 구분한다. HTTP 메소드 : GET, POST HTTP 메소드 종류 GET : 리소스 조회 POST: 요청 데이터 처리, 등록에 사용 PUT : 리소스를 대체 DELETE : 리소스 삭제 PATCH : 리소스 부분 변경 GET 리소스 조회 서버에 전달하고자 하는 데이터는 query param을 통해 전달 GET에서도 body를 지원하긴 하지만 지원하지 않는 서버도 존재하여 권장되지 않음 POST 데이터 등록, 요청 데이터를 통한 프로세스 처리 메시지 body를 통해 서버로 데이터 전달 다른 메소드로 처리하기 애매할 경…

August 22, 2023
WEB
[HTTP 스터디] 1. 네트워크, http 기본

1. 인터넷 네트워크 어떻게 이렇게 복잡한 ‘인터넷’이라는 경로를 거쳐 컴퓨터는 통신하게 되는가? → IP(internet protocol)을 통해서 가능하다. IP 지정한 IP 주소로 ‘packet’이라는 통신 단위로 데이터를 전달한다. 패킷에는 출발지/목적지에 대한 정보가 들어있어서, 클라이언트 ↔ 서버 간에 통신이 가능해진다. Client → Sever Server → Client IP 프로토콜의 한계 그러나 IP프로토콜 만으로는 출발지 ↔ 목적지 사이의 원활하고 안정적인 통신이 불가능하다. 아래의 이유 때문에. 1) 비연결성 패킷을 받을 수 없거나 서비스 불능 상태여도 패킷을 전송한다. 2) 비신뢰성 중간에 패킷이 소실 되는 것에 대한 대책이 없다. 패킷이 요청 순서대로 간다는 것을 보장할 수 없다. 3) 프로그램 구분 같은 IP를 사용하는 서버에서 통신하려는 애플리케이션이 2개 이상인 경우 구분할 수 없다. TCP 이러한 IP 프로토콜의 한계를 TCP 프로토콜이 …

August 16, 2023
WEB
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week1

Part1. 복음 신학: 복음이 본질이다 1. 모든 것이 복음은 아니다 복음 위에 윤리가 구축되고 지혜가 결집되고 신학이 조직화될 수 있지만 윤리규범, 지혜 어록, 조직신학 자체가 복음은 아니다. 하나님의 진노로부터 우리는 구원받았고 하나님과의 관계가 다시 세워지게 되었다. 복음은 충고가 아닌 ‘우리가 구원받았다’는 것을 선포하는 기쁜 소식이다. 복음은 하나님과 우리의 관계를 바로잡기 위해 예수 그리스도가 무엇을 이루셨는가?에 대한 소식이다. 복음은 우리를 ‘그리스도 안’에 있게 하셨다. 복음과 복음의 결과가 혼동되어서는 안 된다. 복음은 그리스도의 완성된 사역이며 가장 먼저 인간과 하나님의 관계를 해결한다. “복음은 사랑의 삶을 창조하는 소식이다. 그러나 사랑의 삶이 그 자체로 복음인 것은 아니다” 복음의 능력을 앗아가는 두가지 적 종교와 비종교, 곧 율법주의와 율법폐기주의다. 복음을 이해하기 위해서는 ‘복음의 전제들’(성경에 대한 배경지식)이 필요하다. 그러나 복음 자체와는 구…

July 30, 2023
독서
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 Week2

Part1. 복음 신학: 복음이 본질이다 3. 복음은 모든 것에 영향을 미친다. 복음의 부요함 성육신과 ‘위에서 아래로 임하는’(upside-down) 복음의 속성 부유하신 분으로써 가난하게 되심. 왕이셨으나 종이 되어 섬기심 희생함으로써 승리하심 모든 것을 잃어버림으로써 모든 것을 얻으심 속죄와 ‘안에서 바깥으로 임하는’(inside-out) 복음의 속성 은혜로 값없이 사랑하셨음을 깨닫는다면 내면의 기쁨과 감사로 그리스도께 순종하는 삶을 시작할 수 있다. 세상의 종교는 바깥에서 우리 내면을 강요하는 것이지만, 복음은 우리 안에서 바깥으로 솟아나오는 것이다. 부활과 ‘미래를 앞서 경험하는’(Forward-Back) 복음의 속성 그리스도의 부활로 하나님나라가 출범했으나 아직 완전히 임하지 않았다. 미래를 앞서 경험하는, 하나님 나라/회복의 측면을 가진 교회는 도시와 이웃의 복지, 사회 참여, 문화 변혁 등에 큰 역할을 하게 될 것이다. 이러한 3가지 측면에서 복음의 통합적 이해는 각…

July 30, 2023
독서
[독서 모임] 도시를 사랑할 수 있을까 - 센터처치 개괄

왜 도시이고 왜 선교인가? 도시선교에 대한 오해 도시선교를 해야 한다면 농촌은 선교하면 안되는 것인가? 그런 것이 아니라 복음은 어디에서나 전해야 하지만 도시의 특수성을 고려할 때 도시에서는 ‘선교’라는 표현을 쓰는 것이 더 적합해 보인다. 왜 그런가? ‘선교’란 타종족에 하는 것이기 때문이다. 그런데 대한민국이라는 같은 나라의 서울이라는 같은 도시에 사는 사람들에게 복음을 전하는 것에 왜 ‘선교’라는 표현을 쓰는 것일까? 도시 내의 ‘종족’ 에 대한 이해 도시가 발전하면서 도시에 ‘종족의 섹터’가 생기기 시작했다. Ex1) 교회 내에서 외국인이 되어 가는 젊은 세대 Ex2) 구디에 있는 게이들과 구디에 있는 시광교인들 이렇듯 빽빽하게 모여 사는 도시 내에는 바로 옆에 있지만 전혀 다른 삶의 형태와 가치관을 가진 여러가지 종족들이 존재한다. 특히 서울은 대한민국에 있는 다른 도시들 ( ex. 포항/울산/거제 등) 과는 달리 단일 문화권이 아니기에 더 많은 종족들이 살아간다고 볼 수…

July 27, 2023
독서
[리눅스 스터디] 5. 인터넷, 네트워크, 도메인

1. 인터넷 DNS A레코드에 대하여 Client - Server 구조 public ip, private ip, NAT 개념 2. Apache 웹 서버 웹 브라우저와 웹 서버 apache 설치, elinks 활용 apache conf 파일에서 log, document root 설정 3. 원격제어 SSH SSH client가 설치된 컴퓨터에서 SSH server가 설치된 컴퓨터를 원격제어 할 수 있다. 이것은 웹브라우저와 웹서버의 관계와 매우 유사하다. SSH 서버 설치하기 openssh-server 설치 sshd가 실행되면 정상이다. 4. 포트(Port) port는 서버의 ‘문’ 과 같은 역할이다. well-known port(0~1024): 22, 80, 443 등 ssh, http도 다른 port로 접속되게 할 수 있다. 포트포워딩 : 라우터의 설정에서 private network의 포트 포워딩 할 수 있다. 5. 도메인 hosts 파일 도메인 구입 서브 도메인 DNS 동작 …

July 24, 2023
Linux
[Error] docker: failed to register layer: open /var/lib/docker/overlay2/... : no such file or directory.

디스크 공간 부족으로 docker 컨테이너 관련 파일을 정리하던 도중 실수로 건드려서는 안되는 /var/lib/docker/overlay2 디렉토리 하위의 몇몇 파일들을 삭제했다. 덕분에 새로운 이미지로 pull하여 컨테이너 기동시 아래와 같은 오류가 났다. Docker 데몬 중지 sudo systemctl stop docker /var/lib/docker/overlay2 디렉토리 백업 해두기. 혹시 모르니 기존 디렉토리는 백업해두자. Docker 데몬 초기화 이렇게 하니 해결되었는데 구글링해보니 도커를 완전히 삭제 후 재설치해야 해결되는 경우도 있다고 한다. 끝.

July 22, 2023
Error
[리눅스 스터디] 4. 사용자 & 권한 & 그룹

다중 사용자 id : 를 쉘에서 입력하면 uid, gid 등에 대한 정보를 알 수 있다. who : 명령은 현재 서버에 누가 접속 했는 지를 확인 할 수 있다. 관리자와 일반 사용자 관리자는 super user의 권한을 갖고, 일반 사용자가 임시로 super권한을 쓰기 위해서는 ‘sudo’ 명령을 쓰게 된다 sudo passwd -u root root 사용자 unlock하기 sudo passwd -l root root 사용자 lock하기 사용자의 추가 : 홈 디렉토리의 생성과 함께 ( -m 옵션 ) tester라는 계정을 생성함 : 비밀번호 설정 권한 권한을 지정한다는 것은 리눅스에서는 ‘파일과 디렉토리’에 대한 읽기/쓰기/실행 하는 권한을 말한다. 파일의 권한 chmod : 권한 변경하기 파일/디렉토리의 access mode를 변경하기 위해서는 ‘chmod’라는 명령어를 사용한다. chmod {u/g/o/a}{+/-}{r/w/x} 로 해당 명령을 쓸 수 있고 숫자로도 chmo…

July 19, 2023
Linux
[Error] VM 꺼짐으로 인한 Kubernetes crash 이슈

https://igotit.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-10-%EC%9E%90%EB%8F%99%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EC%9E%90%EB%8F%99%EC%9E%AC%EB%B6%80%ED%8C%85-%EB%B0%A9%EC%A7%80-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

July 16, 2023
Error
DevOps
[Error] VM 자동 재부팅시 kubelet 재기동 실패 - swap 메모리

Host 서버가 native OOM 이슈로 자동 재기동되면서 VM도 모두 재기동되었다. 그런데 kube-apiserver가 올라오지 않아 살펴봤더니 모든 노드의 kubelet이 죽어 있었고, 위 로그로 kubelet의 실패 원인을 살펴보았더니 아래와 같은 에러 메시지가 출력되었다. 결론은 node마다 swap 메모리가 off가 안되어 있어서 그랬던 것이다. 자세한 내용은 아래 링크를 참고하자. https://my-grope-log.tistory.com/30

July 16, 2023
Error
[Error] 호스트(host) 서버에서 VM의 SSH 접속이 매우 느린 현상

호스트 서버에서 평소에는 늘 VM에 SuperPutty로 접속하면 접속이 잘 됐었는데, 어느 날 갑자기 로그인 창에서 패스워드 입력하라고 나오지 않기 시작했다. 아주 오래 기다려 나오더라도 패스워드 입력도 제대로 안 먹혔다. 해결 방법 1 /etc/ssh/sshd_config 파일의 UseDNS 설정을 변경한다. UseDNS yes로 디퐅르 설정이 되어 있어 Reverse DNS를 하기 때문에 UseDNS no 로 변경해 한다. 변경 후 sshd 데몬 reload 해결 방법 2 해결 방법 1을 해도 안될 경우! 호스트 서버에서 자동으로 ip를 할당 받도록 하지 않고, 8.8.8.8, 8.8.4.4 를 DNS서버로 지정해준다. 그리고 VM에서도 /etc/sysconfig/network-scripts/ifcfg-eth0 파일의 설정에서도 아래와 같이 DNS 서버 정보가 호스트와 일치하도록 해주면 된다. 해결 방법 3 이래 저래 해도 안 될 경우 호스트 서버의 ‘이더넷’ - ‘속성’ …

July 13, 2023
Error
[Error] K8S : Spring boot pod - MySQL 연결기

‘Communications link failure’ spring boot pod 로그 살펴보면 계속 이와 같은 에러가 났는데, 구글링 했을 때 여러가지 해결방안은 있었지만 결국 나에게는 pod가 DB와 3-handshake자체가 안됐었던 것이 문제였다. host서버에서 wireshark로 분석해보니 mysql로 SYN으로 보내는 패킷만 있고 ACK를 받지 못하고 있었다. 그런데 막상 호스트 서버에서 직접 mysql로 dbeaver통해 붙을 땐 잘 붙었다는 것. 호스트 서버로 잘 들어오는데 Vm으로 포워딩은 못해주고 있는 게 문제니깐 포트 포워딩이 결국 문제였던 것이다. 포트 포워딩을 수정해주고 나서 해결되었음. ‘Public Key retrieval is not allowed’ 아래와 같이 datasource url에 ‘allowPublicKeyRetrieval=true’로 변경해주면 됨 MySQL에서 좀 더 자세한 로그 보는 방법 /etc/my.cnf에서 아래 내용 추가 후 …

July 13, 2023
Error
[리눅스 스터디] 3. 프로세스

컴퓨터 구조 storage로부터 프로그램을 읽어서 프로세스로서 메모리에 적재시키며 이를 processor인 CPU가 실행시킨다. 프로세스 모니터링 ps 사용법 htop 사용법 Load average 프로세스의 실행 백그라운드 Ctrl+Z : 프로세스를 백그라운드로 전환 jobs : 백그라운드에서 실행 중인 프로셋 확인 가능 fg : 백그라운드에서 실행 중인 프로세스를 포그라운드로 전환 : 4번 job을 전환 그냥 만 하게 되면 + 표시 되어있는 프로세스가 전환됨 & : 백그라운드로 프로세스 실행 bg : Stopped 된 백그라운드 프로세스를 다시 실행 시킴 항상 실행 (데몬) systemctl을 이용한 서비스 제어 : CentOS7부터는 ‘service’가 아닌 ‘systemctl’ 사용 /etc/init.d 디렉토리에는 데몬 실행 스크립트들이 모여있다. /etc/rc3.d 디렉토리에는 데몬 실행 스크립트에 대한 심볼링 링크가 모여있다. shell로 부팅되면 rc3. GUI로…

July 12, 2023
Linux
On-premise 7. Redis 구축하기

Redis 설치 remmi repo를 사용하지 않고 그냥 yum install하게 되면 redis3버전이 latest이므로 반드시 remi repo를 사용해야 한다. Redis 실행 Redis 구축 개발계 Redis 설정 redis를 설치한 현 상태에서는 systemctl 명령어로 단일 ‘redis’ 서비스만 관리할 수 있다. 나는 개발계용 redisdev service부터 운영용 redis1, redis2, redis3 service를 관리하고 싶은 상황이다. 따라서 최초에 실행 한 redis를 redisdev라는 서비스로 띄우고, 관련된 설정도 수정하고자 한다. 기존에 실행되고 있는 redis service를 내린다. /usr/lib/systemd/system/redis.service -> redisdev.service로 명칭 변경 /etc/redis.conf의 이름을 redisdev.conf로 변경하고, 해당 파일 내에 redis 관련된 path를 변경한다. 변경 한 경로의…

July 11, 2023
DevOps
On-premise 6. DB 서버 구축하기

MySQL 8.0 설치 1. 설치가능한 MySQL repository 확인 www.mysql.com/products/community/ 2. MySQL Repository 설치 1에서 확인한 yum, CentOS 7버전에 해당하는 repository를 찾아서 설치한다. 직접 찾아서 설치하지 않으면 outdate 될 수 있기 때문에 반드시 mysql홈페이지에서 직접 repostiory찾아야 한다. 3. MySQL 설치 4. MySQL 서버 시작 및 셋팅 아래 명령을 통해 설치된 mysql서버의 root 계정 비밀번호를 알아 낼 수 있음 MySQL Secure installation : MySQL 보안 강화하기 명령을 통해 mysql이 권장하는 보안 관련된 기본 설정을 셋팅한다. 이 과정에서 mysql에서는 root비밀번호 변경을 요청하니까 위에서 알아낸 password를 입력하고 변경하면 된다. 나중에 직접 root계정 비번만 변경하려면 아래와 같이 하면 됨 root계정 비밀번호…

July 10, 2023
DevOps
[리눅스 스터디] 2. Shell Script, 디렉토리 구조 및 파일

1. 쉘(Shell) Shell vs Kernel 쉘은 무엇이고 커널은 무엇인가? Kernel은 H/W를 제어하는 OS에서 가장 중요한 코어와 같은 역할이다. Shell은 유저가 직접 커널을 조작하는 것은 매우 어렵기 때문에 유저가 실행한 application을 kernel이 이해할 수 있는 형태로 변환시켜준다. shell도 프로그램이기 때문에 종류가 한 개만 있는 것이 아니라 bash, zsh등 여려가지가 존재하며 명령을 통해 현재 사용되고 있는 shell이 무엇인지 확인할 수 있다. 2. 쉘 스크립트(Shell script) shell script의 맨 처음에는 를 적어줌으로써 bash 쉘을 사용하는 스크립트임을 명시한다. 예시 : 간단한 log파일 백업 스크립트 3. 디렉토리 구조 리눅스 OS의 디렉토리는 기본적으로 아래와 같은 구조를 가진다. https://www.thegeekstuff.com/2010/09/linux-file-system-structure/ /sbin…

July 04, 2023
Linux
On-premise 5. 네트워크 설정

SSL 설정 K8S 네트워크 관련 에러 CNI 재설치 Calico Calico 제거 Calico 설치 On-premise2 k8s 구성 참조 Flannel Flannel 설치 pod-cidr 설정을 k8s cluster와 맞춰주도록 하자. Flannel 제거 참고자료 https://lcc3108.github.io/articles/2020-12/certmanager https://www.youtube.com/watch?v=BlzRx6ROiX0

July 02, 2023
DevOps
On-premise 4. Istio 환경 구축하기

Istio 환경구성 Istio 설치 생각보다 istio 설치하는 것 자체는 간단하다. 아래와 같은 과정을 따라 하면 끝이다. Istioctl 다운로드 : controlplane에서 다운로드 한다. istioctl 명령어 사용하기 위한 PATH 등록 istio 설치 ( https://istio.io/latest/docs/setup/install/istioctl/ ) istioctl로 바로 설치하기 default Profile으로 설치됨 설치 후 deployment에 istiod, istio-ingressgateway설치되었음을 확인 가능 istio-operator로 설치하기 : 이렇게 하면 istio-operator namespace와 함께 istio-operator pod가 생성된다. 그런 후 k apply -f 를 해서 아래 istio-operator 파일을 apply 해주면 istiod, istio-ingressgateway, egressgateway 등 istio가 …

July 02, 2023
DevOps
On-premise 서버 구축하기 3. 호스트 서버 보안

무작위 접속 시도 차단을 위한 ipban 적용 github에서 https://github.com/DigitalRuby/IPBan/releases url로 ipban을 다운로드 한다. 로그인/로그오프 기록을 로깅하여 ‘이벤트뷰어’-’보안’ 에서 확인하도록 하기 서비스등록 ipban.config 수정 후 서비스 재기동하기 로그인 5회 실패시 등록 이벤트 뷰어 보는 법 [실행창] - “eventvwr” 입력하면 된다. 생각보다 호스트 서버에 무작위로 접속 시도하는 경우가 많아서 윈도우 서버의 경우 이벤트 뷰어에 들어가서 누가 언제 호스트 서버에 접속했는지 확인할 수 있다. 접속 시도와 관련된 이벤트 id 및 로그온 유형은 다음과 같다. Event ID 4624 성공적인 로그인을 뜻한다. 따라서 관리자가 접속한 시간이 아닌 경우에 4624가 발생했다면 외부 공격을 의심해야 한다. 4625 계정 로그온 실패로 분류되며, 나의 경우에는 이벤트 뷰어에서 4624 이벤트가 초 단위로 쌓…

July 02, 2023
DevOps
On-premise 1. 공유기, 서버, 네트웍 설정

1. 서버/VM 구축 1. 서버 셋팅 1) 공유기 설정 공유기 어드민 콘솔에 접근하여 DDNS 설정, 포트포워딩, 고정IP 할당을 해준다. 공유기 콘솔에 접근 하는 방법은 공유기 제조사 마다 다른데, 나의 경우는 tplink라서 192.168.0.1로 접근 가능 고정 IP 설정 공유기 콘솔에 들어가면 연결된 서버에 고정 ip를 할당 포트포워딩 설정 할당된 고정 ip에 포트포워딩을 설정한다. 예를 들어 공유기로 8080 포트로 들어왔을 때 서버의 9090포트로 포워딩 되도록 설정하는 것이다. 동적 DNS 설정 ( DDNS ) 실제 공유기의 공인 ip는 변동되기 때문에 동적 DNS 설정을 통해 ‘aaa.tplinkdns.com’ 이런 도메인으로 외부에서 서버로 접속 할 수 있도록 해주어야 한다. 여기까지 하면 aaa.tplinikdns.com:8080으로 접속했을 때, 내 서버가 설치된 공유기의 8080포트로 접속이 되게 되고, 고정ip와 포트포워딩 설정을 통해 LAN내에 존재하는 내…

July 01, 2023
DevOps
On-premise 2. K8S 클러스터 설치

1. 사전 설정 : 사전 설정은 모든 노드에서 실행해주어야 한다. cri-docker Install cri-docker Version Check cri-docker Active Check Docker cgroup Change Require to Systemd 2. 패키지 설치 : kubeadm, kubectl, kubelet 패키지 설치도 모든 노드에서 실행 해준다. Swap disable 처리 iptable이 bridged traffic 을 바라볼 수 있도록 설정. 컨테이너는 가상화된 네트워크 인터페이스를 사용하므로, 컨테이너 간의 통신 및 네트워크 기능을 지원하기 위해 호스트 단에서 커널 parameter를 위와 같이 변경하는 것이다. net.bridge.bridge-nf-call-ip6tables = 1: 이 설정은 IPv6 네트워크 트래픽이 브리지로 전달되어 IP 테이블에서 필터링될 수 있도록 한다. net.bridge.bridge-nf-call-iptables = …

July 01, 2023
DevOps
[리눅스 스터디] 1. 리눅스 기초 & IO redirecdtion

1. 리눅스 기초 디렉토리와 파일 기본 명령어 ls, pwd, mkdir, touch, cd, rm 등 명령어에 옵션을 붙일 수 있음 ls -al, rm -r, mkdir -p, ls -S( file size sort desc ) . , .., ~ 의 의미 —help와 man man 명령어는 전용 페이지로 넘어가서 보다 상세한 설명을 알려줌. sudo 관리자의 권한으로 명령을 실행 시 필요함. 패키지 매니저 다양한 소프트웨어들을 패키지라고 한다. 가령 ls, mkdir, man등도 모두 패키지이다. 하지만 기본적으로 제공하는 프로그램이 아닌 다른 것들은 패키지 매니저를 통해 설치해야 한다. 일종의 앱스토어라고 생각하면 된다. 우분투 계열의 패키지 매니저인 apt-get 사용법을 알아보자. ( redhat 계열 : yum ) htop 을 활용하면 CLI기반에서도 꽤나 GUI와 같은 형태로 리소스의 상태를 확인할 수 있다. 패키지 설치 sudo apt-get install htop 패…

June 28, 2023
Linux
[Kotlin] 코드 제어하는 방법

제어문 If문, Expression 과 Statement 기본적인 if-else의 문법은 동일하다. Java에서 if-else는 Statement이지만 Kotlin에서는 expression이다. 즉 삼항연산자 처럼 값을 리턴할 수 있다. 따라서 삼항연산자가 없음 in 연산자를 활용 가능 switch 와 when switch case 문 대신에 when으로 kotlin에서는 대체되었으며 조건부를 다양하게 사용할 수 있다. image1 is 문, ..문 등 사용 와 같이도 쓸 수 있음 when뒤에 소괄호없이 바로 조건부와 결과로만 when절을 구성할 수도 있다. Enum 클래스, Sealed 클래스와 함께 사용할 경우 더욱 진가가 발휘된다. 반복문 for-each 문 ( 향상된 for문 ) ’:’ 대신 ‘in’을 쓰는 정도만 다르다. 전통적인 for문 in을 사용한여 범위를 표현한다. progression, range를 활용한 등차수열을 쓴다. downTo, step 등의 표현 예외 …

April 28, 2023
Java/Kotlin
VI editor option

vim 에디터를 사용할 때 .vimrc를 편집하여 아래와 같은 설정을 추가해주면 좋다.

January 18, 2023
Linux
[Error] Prometheus CrashLoopbackOff

개발, 검증계와 동일한 prometheus의 yaml파일로 운영에서 pod 생성시 CrashLoopbackOff 상태에 빠지게 된다. configmap-reload 컨테이너를 제외시키고 prometheus pod의 로그만 확인 시, ‘/mnt/pv/… file not found’ 와 같은 에러가 발생했다. 실제 pod에서는 컨테이너 기동 시에 해당 tsdb를 찾으려고 하는 모양인데 실제 volume에는 해당 파일이 없는 것으로 pv debugger를 활용하여 확인하였다. PV debugger 활용 PV에 직접 접근할 방법이 별도로 없기 떄문에, busybox 이미지를 활용하여 문제가 되는 prometheus의 pvc를 volume으로 설정, mount하여 접근한다. 결국 tsdb의 path로 마운트된 볼륨에서 해당 경로를 백업한 뒤 모두 비워주고 Pod를 기동하니, 새로운 데이터를 쌓으면서 정상적으로 pod가 기동됨을 확인하였다.

December 14, 2022
Error
DevOps
[AWS architect] 13. 백업 및 복구, 재해대책

개요 재해 발생 시 인프라를 보호하는데 사용할 수 있는 전략은 무엇인가 백 가동 중단 시간을 최소화하면서도 비용 효율적인 방안은 무엇인가 가용성 고가용성 내결함성 백업 재해 복구 RPO, RTO RPO : 데이터 백업해야 하는 빈도 RTO : 복구하는데 걸리는 시간 스토리지 복제 Amazon S3 : cross-region replica Amazon EBS : 스냅샷을 떠서 S3에 저장할 수 있다. 복구용 AMI 구성 데이터베이스 백업 및 복제 RDS DynamoDB AWS backup 지속적인 학습 실습 링크 : https://us-east-1.student.classrooms.aws.training/class/5Hg5hDtgWR8wnGDGevtJcR 실습 참고 영상 : https://us-east-1.student.classrooms.aws.training/class/5Hg5hDtgWR8wnGDGevtJcR AWS architecture 그리기 https://aws.amazon…

July 08, 2022
AWS
DevOps
[AWS architect] 12. Edge service

개요 Route 53 CloudFront 정적 콘텐츠 캐싱 뿐만 아니라 동적 콘텐츠 가속화 ( AWS 고속 네트웍 망 활용) 하는 데에도 사용된다. 성능 개선 DDoS 보호 정상 패킷으로 공격 OSI 계층 공격 AWS Shield AWS WAF 6,7 계층 공격 방어 DDoS 복원력 참조 아키텍처 AWS outposts AWS 장비를 on-premise로 가져와서 private하게 사용하되, AWS의 코어 서비스를 활용할 수 있다. 실습

July 08, 2022
AWS
DevOps
[AWS architect] 11. Serverless

개요 Serverless란 프로비저닝, 관리할 인프라 없음 소비 단위에 따라 자동으로 scaling 내장된 보안/고가용성 컴퓨팅 [AWS 서버리스 서비스 목록 이미지] 서버리스 아키텍처 예시 Amazon API Gateway cognito, lambda 등을 통해 인증 붙일 수 있음 샘플 아키텍처 Amazon SQS 완전관리형 메시지 대기열 서비스 표준 대기열은 순서가 완전히 보장되지는 않는다. FIFO는 보장 Amazon SNS Amazon Kinesis AWS Step Functions 시각적 워크플로우를 사용한 마이크로서비스 조정 각 단계를 자동으로 시작하고 추적할 수 있다. 로그 및 시각화 제공 [이미지] Amazon State Language 실습 : 서버리스 아키텍처 구축

July 08, 2022
AWS
DevOps
[AWS architect] 10. Networking2

개요 AWS 서비스에 대한 연결을 프라이빗 상태로 유지할 수 있는가 VPC 간에 private 방식으로 트래픽을 라우팅하려면? 온프레이미스 <-> AWS 를 연결하려면 VPC Endpoint internet gateway 타지 않고 privateg하게 private subnet내에 있는 EC2 instance와 AWS 완전 관리형 서비스인 DynamoDB를 통신하게 할 수 있다. VPC Endpoint가 없다면 NAT를 타고 IGW를 타고 통신해야 한다. VPC 만들 때 Gateway endpoint와 Interface endpoint 하나 씩만 최초에 만들어주면 된다. Gateway endpoint 라우팅 테이블에 지정된 대상 S3, Dynamo DB 서비스 지원 추가 비용 없음 Interface endpoint private IP의 ENI를 통해 서비스와 통신한다고 이해하면 됨 추가 비용 존재 VPC endpoint도 리소스이므로 리소스 기반 정책을 적용할 수 있다. [심층 방…

July 08, 2022
AWS
DevOps
[AWS architect] 9. 컨테이너

AWS애서의 컨테이너 실행 컨테이너 오케스트레이션 EKS : AWS에서 지원하는 k8s 사용 툴 ECS : AWS에서 개발한 오케스트레이션 툴 ECR : AWS에서 개발한 고가용성 Container registry Fargate, EC2 : 컨테이너 호스팅 EC2의 유휴 리소스를 컨테이너가 다 활용하지 못하면 리소스 낭비이기 때문에 Fargate가 등장하게 되어 컨테이너를 서비리스하게 사용하게 되었음. K8S 아키텍처 [이미지] Amazon EKS controlplane은 AWS가 관리해준다. 워크로드는 Fargate를 활용하거나 EC2를 활용하여 워커노드를 구성한다. EKS workshop을 통해서 EKS 실습해볼 수 있다.

July 07, 2022
AWS
DevOps
[AWS architect] 7. AWS Monitoring

AWS Cloudwatch AWS의 모든 자원은 cloudwatch에 의해서 모니터링 된다. CloudWatch Logs AWS CloudTrail AWS 인프라에서 계정활동을 로깅/모니터링 한다. CloudTrail 로그 예시 VPC 흐름 로그 [image] 송/수신 되는 ip 트래픽에 대한 정보를 모두 수집하여 볼 수 있다. 네트웍 트러블슈팅 시 사용됨 Kinesis Firehose 활용 -> Datadog, splunk Elasticsearch 와 같은 SaaS 연동하기에 용이함 사용자 정의 로그 logback에서 수집한 로그를 CloudWatch agent를 설치하여 연동함으로써 Amazon CloudWatch Logs로 전송할 수 있다. CloudWatch 경보 [417 image] Eventbridge ELB (elastic load balancing) L4/L7 역할, round-robin이 디폴트. 상태확인 수행하여 문제 있을 시 그 쪽으로 안 보냄 무조건 2개 이상…

July 06, 2022
AWS
DevOps
[AWS architect] 8. AWS 자동화

IaC IaC의 장점 : 재사용성과 업데이트 AWS CloudFormation CloudFormation > Stack > create Stack에서 IaC yaml파일을 등록하여 한 꺼번에 프로비저닝 할 수 있다. AWS 대부분의 리소스를 CloudFormation 템플릿으로 제어할 수 있다. AWS Elastic Beanstalk 웹 콘솔에서 클릭으로 할 수 있기 때문에 편의성 면에서 프로비저닝하기 더 좋다. AWS CDK(Cloud Development Kit) python, typescript 등의 언어로 컴파일하여 CloudFormation template을 만들어준다. [보충 이미지] AWS 솔루션 라이브러리 사전 구축된 참조 아키텍처이며 도메인 별로 활용될 수 있는 다양한 아키텍처를 확인할 수 있다. CloudFormation 파일을 제공하는 아키텍처들도 있다. AWS Systems Manager 실습 3: AWS VPC 인프라에 데이터베이스 계층 생성 [실습 아키 이…

July 06, 2022
AWS
DevOps
[AWS architect] 6. AWS Database 서비스

개요 AWS 데이터베이스 솔루션은 무엇인가 클라우드에서 RDB를 더욱 효율적으로 관리할 수 있는 방법은 무엇인가 확장 가능한 key-value NoSQL을 구축하려면 어떻게 해야하는가? AWS 클라우드에서 데이터베이스를 캐시하는 방법은 무엇인가 기존 DB에서 AWS 클라우드로 마이그레이션 할 때 사용하는 도구는 무엇인가 RDB 및 NoSQL [image] 여러가지 AWS 데이터베이스 서비스 RDS, Aurora, DynamoDB외에도 Neptune등 많은 서비스가 있음 크기 조정, 고가용성, DB백업, DB s/w 패치, 설치 OS 패치 등의 작업을 사용자가 직접할 필요 없음 크기 조정 시 blue-green deploy도 지원하여 서비스 다운타임도 없앴을 수 있음 RDS [이미지] RDS Multi AZ 배포 stanby instance를 primary instance와 다른 AZ에 두고, 동기화 복제를 사용한다. primary instance가 fail 되면 stanby가 바로…

July 06, 2022
AWS
DevOps
[AWS architect] 5. AWS Storage

개요 블록/파일/객체 스토리지를 검토할 때 고려해야 하는 서비스는 무엇인가? 사용 사례에 적합한 객체 스토리지 솔루션을 어떻게 선택하는가? AWS에서 안전하고 확장 가능한 보안 스토리지를 구축하기 위한 파일 기반 옵션은 무엇인가? 어떻게 하면 짧은 시간 내에 대량의 데이터를 클라우드로 이관할 수 있는가? 스토리지(다시 듣기) 스토리지는 일반적으로 3개의 타입으로 나뉜다. 블록 스토리지 원시 스토리지 데이터가 관련 없는 블록의 어레이로 구성된다. 읽기/쓰기 자유 하드디스크, SAN 파일 스토리지 NAS 객체 스토리지 블록/파일 스토리지와 달리 디스크에 마운트 되지 않는 솔루션이다. http요청에 의해서 쓴다. ‘비연결 기반’이기 때문에 확장성이 매우 높다. 저장된 객체에 대한 unique key가 존재한다. [254 이미지] Amazon S3 버킷을 만들 때 용량을 설정하지 않는다. 용량이 무제한임 버킷에 데이터를 넣으면 3개 이상의 가용영역에 데이터를 복제하여 매우 고가용성이다. …

July 06, 2022
AWS
DevOps
[AWS architect] 3. Networking 기초

개요 워크로드를 지원하기 위해 충분한 IP주소가 네트웍에 있는 지를 어떻게 확인하는가? AWS 계정에 안전한 동적 네트워크 인프라륵 구축하는 방법은 무엇인가? 네트워크의 리소스 보호를 위해 인/아웃바운드 트래픽을 필터링하는 방법은 무엇인가? IP 주소 지정 -> 워크로드를 지원하기 위해 충분한 IP주소가 네트웍에 있는 지를 어떻게 확인하는 하는가? -> 즉 데이터 센터를 얼마나 크게 지을 것인가와도 관련이 있다. ip주소는 네트워크와 호스트를 식별한다. IPV4는 고갈되었기 때문에 NAT 대역을 사용하며 RFC1918규약에 따라 보통 10.대역, 192. ,172. 대역을 사용한다. CIDR ( classless inter-domain routing ) IP를 예전에는 클래스 단위로 나누었지만 해당 방법은 비효율적이어서 CIDR방법을 요즘에는 사용한다. VPC에서 지원되는 CIDR블록 /16 : 65536개 … /28 : 16개 VPC(Virtual Private Cloud)…

July 05, 2022
AWS
DevOps
[AWS architect] 4. Computing

개요 EC2에 서버를 배포할 때 고려해야 할 사항이 무엇인가? EC2에 연결할 볼륨 유형을 어떻게 알 수 있는가?(EBS) 비용을 최적화 하는 방법은 무엇인가? 서버리스 컴퓨팅 옵션은 어디서부터 시작할 있는가? EC2 인스턴스 생성 시 고려사항 이름/태그 태그 룰 지정 : enterprise레벨에서는 중요햐다. [ 태그 룰 이미지 ] AMI(Amazon Machine Image) : OS image + 필요한 설정 enterprise 레벨에서는 기본 AMI에 보안 등의 설정을 추가하여 ‘사용자 지정 AMI’로 만들어서 사용한다. 인스턴스 유형 이해 [ 인스턴스 유형 이름 이미지 ] 인스턴스 패밀리 범용 : T3, M5 메모리 최적화 : R5 스토리지 최적화 : I3 컴퓨팅 최적화 : C5 가속 컴퓨팅 : G4, F1 인스턴스 세대 : 최신 세대를 쓰는 것이 오히려 비용이 더 줄어듬. 추가 속성 : g(graviton), a(amd) 등 인스턴스 크기 : xlarge, 2xlarge…

July 05, 2022
AWS
DevOps
[AWS architect] 2. Account & Security

보안 주체와 자격증명 보안주체란 AWS리소스에 대한 작업을 요청할 수 있는 엔티티 root user IAM user IAM group Role IAM 구성요소 User Group : user는 여러 그룹에 속할 수 있다. Policy : json으로 구성된 권한을 담은 document Role : 임시 권한 부여(안전모)할 떄 사용 보안 정책 IAM 자격증명 기반 정책 ( 열쇠 들고 따고 들어가는 유형 ) IAM리소스 기반 정책 ( 경비원이 문 열어주는 유형 ) IAM 자격 증명 기반 정책 자격 증명 기반 정책의 경우 아래와 같다. 서비스 액세스 AmazonEC2FullAccess AmazonEC2ReadOnlyAccess 직무 AdministratorAccess Billing 사용자 정의 정책 DiChaTeam … 자격증명 기반 정책은 다음과 같이 작성할 수 있다. IAM 리소스 기반 정책 리소스 기반의 정책은 S3버킷이나 Lambda함수와 같은 단일 리소스에 연결되며 어떤…

July 05, 2022
AWS
DevOps
[AWS architect] 1. Architecting 기초

AWS 인프라 AWS는 2023년 7월 현재 전 세계 31개의 리전(region)을 지원하며, 각 리전은 최소 3개 이상의 가용영역(Availability zone)으로 이루어져 있다. 각 가용영역은 1개 이상의 데이터 센터로 구성되어 있다. Region Availability zone Local zone Edge location 어떤 리전을 선택해야 하는가? 법규(governence) 지연시간(latency) 서비스(AWS service) : 리전 별로 지원하는 서비스 수가 다름 비용 : 예컨대 상파울로 리전은 브라질 현지 전기 사정이 안 좋아서 직접 발전기까지 돌리기 때문에 cost가 비쌈 로컬 존(Local zone) region을 만들기까지는 애매한 지리적 위치에 있는 사용자에게 낮은 latency로 서비스를 제공하고자 할 떄 사용된다. 예컨대 Oregon region 안에는 LA의 로컬 존이 있다.(oregon<->LA거리 약 1000km) AWS에서는 LA가 별도 reg…

July 05, 2022
AWS
DevOps
DBeaver에서 MySQL DB dump하여 복사하기

기존에 MySQL 환경에서 1개 database로만 운영하던 서비스에 dev용 database를 추가하기 위해 DBeaver에서 dump하여 복사한 방법을 알아보자. 먼저 복사하려는 대상 db에서 우클릭하여 ‘dump database’를 선택한다. 그 후 정확한 DB와 모든 table들을 선택한 후 다음 output 폴더를 지정해주고 local client를 설정해준 이후 ‘Start’ 버튼을 눌러 dump하면 끝이다. 그 후 dev용 database (나의 경우 onyou-dev) 를 생성한 다음 우클릭하여 Restore database를 선택한다. 기존 db에서 dump로 생성했던 sq을 선택하고 ‘Start’ 눌러주면 끝이다.

July 01, 2022
Data
DevOps
[QueryDSL] 3. QueryDSL 기본문법 (2)

querydsl의 기본문법 중 조인, 서브쿼리, case문 등에 대해서 알아보자. 1. 조인 기본적으로 jpql의 조인과 같다. 연관관계가 없어도 querydsl에서 join을 할 수 있다. Join on 절 on절을 사용하면 조인할 대상을 줄여준다. 조인 대상 필터링 inner join일 경우는 on을 쓰는 것과 where에 조건을 더하는 것과 동일한 결과를 반환한다. left join일 경우에는 없는 것도 left 부분은 가져오기 때문에 위와 같은 방법을 써주어야 한다. 따라서 outer join이 필요한 경우에만 on필터링을 사용하자. 연관관계가 없는 엔티티 outer join 일반 조인 : leftJoin(member.Team, team) on 조인 : from(member).leftJoin(team).on(…) 2. Fetch 조인 페치조인은 SQL에서 제공하는 기능이 아니고 SQL 조인을 활용해서 연관된 엔티티를 SQL 한번에 조회하는 기능이다. 성능 최적화를 위해 사용…

June 10, 2022
Spring
[QueryDSL] 2. QueryDSL 기본문법 (1)

QueryDSL이 무엇인지와 환경설정하는 방법에 대해 배웠으니 이제 본격적으로 문법을 배워보자. 1. 기본 Q-Type 활용 querydsl 라이브러리가 생성한 Q 클래스를 살펴보면 아래와 같이 static 변수로 클래스에 대한 Q객체를 생성해 둔 것을 확인할 수 있다. 따라서 우리가 querydsl을 사용할 때는 static import로 해당 객체를 불러와서 객체의 멤버 변수인 ‘member’를 사용하면 아래와 같이 간결하게 코드를 짤 수 있다. 그리고 Spring에서 주입해주는 em 은 멀티쓰레드 환경에서 안전하도록 구성되어 있기 때문에 JPAQueryFactory는 동시성 문제를 고려하지 않고 따로 클래스의 필드로 빼서 사용하면 된다. 멀티쓰레드 환경에서 현재 나의 transaction이 어디에 걸려있느냐에 따라 transaction에 바인딩 되도록 em을 분배해주기 때문이다. 2. 검색 조건 쿼리 querydsl은 JPQL이 제공하는 모든 검색조건에 대한 메소드를 제공한…

June 09, 2022
Spring
[QueryDSL] 1. QueryDSL이란? QueryDSL 환경설정

1. QueryDSL이란? QueryDSL은 Java 코드로 쿼리를 짜서 DB에 접근하는 방식이다. 기존 데이터 접근 방식인 jdbcTemplate, Mybatis 와 같은 방법에서는 직접 SQL 쿼리를 짜야만 했다. JPA에서는 Spring data jpa를 통해서 조회 조건이 간단한 쿼리 같은 경우에는 별도의 쿼리를 짜지 않고도 DB로부터 데이터를 불러 올 수 있었다. 그러나 복잡한 조회가 필요할 경우 불가피하게 JPQL을 통해서 아래와 같이 쿼리를 직접 짜야 했다. 그러나 QueryDSL을 사용하면 아래와 같이 자바코드의 형태로 쿼리를 짤 수 있고 여러가지 장점이 있다. 컴파일 타임에서 에러를 잡을 수 있다. 코드 자동 완성의 도움을 받을 수 있다. 동적쿼리를 편하게 짤 수 있도록 도움을 준다. 메소드를 뽑아 낼 수 있어 재사용이 가능하다. parameter 바인딩을 자동으로 해준다. Spring data JPA와 QueryDSL을 함께 활용하면 RDB를 사용한 개발환경에서 …

June 05, 2022
Spring
[AWS] Spring boot에서 AWS S3로 파일 업로드하면서 DB에 URL 저장하는 방법

Spring boot 개발환경에서 AWS S3를 활용하여 파일을 업로드하고 이를 DB를 URL로 저장하는 방법과 파일 명을 이용해서 S3로부터 파일을 다운로드 하는 방법에 대해서 알아보자. 1. Spring boot 의존성, 환경 설정 build.gradle app.properties 2. S3 Config 클래스 설정 위 application.properties에서 설정한 accessKey, secretkey, region값을 @Value 어노테이션을 활용하여 AwsS3Config 클래스에서 가져와서 AWSCredential을 설정한다. 이 때 나는 jasypt를 활용해서 key값을 보호하도록 했는데 해당 내용은 이 글을 참고하자. 3. S3 업로드 Controller 설정 나는 본 글의 title처럼 Club이라는 entity를 생성할 때 S3에 썸네일 이미지가 업로드 됨과 동시에 DB에 S3에 업로드된 이미지의 URL도 저장되도록 설정하도록 하였다. 그리고 그러기 위해서 @R…

April 23, 2022
AWS
[AWS] AWS key값을 Jasypt를 이용해서 보호하자

Spring boot 환경에서 AWS S3를 연동해서 사용하려고 하면, application.yml 또는 application.properties에 아 래와 같이 accessKey, secretKey값을 설정해줄 것이다. 그런데 이렇게 설정을 하게 되면 AWS의 accessKey, secretKey값이 깃헙에 노출되는 문제가 발생한다. 이미 나는 그걸 모르고 별일 없겠지라는 안일한 생각으로 깃헙에 코드를 푸시했다가 이틀 만에 해킹(ㅠㅠ) 당하는 일을 겪어야 했다. 이틀 만에 80 달러 치를 썼더라 해커놈 ㅡㅡ 그러니 반드시 Jasypt를 활용해서 AWS key값을 암호화해서 올리시길 바란다. Jasypt : Java Simplified Encryption으로 암호화를 위한 Library이다. 보통 프로퍼티에 노출되는 중요 정보들을 암호화 해주는 용도로 사용한다. 1. 의존성 설정 ( build.gradle ) 나는 gradle을 사용하기 때문에 아래와 같이 간단한게 jasypt를 …

April 15, 2022
AWS
[Error] insert시 select key 후 inesrt로 인한 에러 발생 조치 (JDBC-5074: Given String does not represent a number in proper format)

운영하는 사이트에서 메일엔진 솔루션을 사용 중인데 메일엔진이 mail_queue라는 테이블에서 데이터를 긁어가서 메일을 일괄 발송하는 방식이다. 그런데 갑자기 사이트에 장애가 발생해서 mail_queue 테이블에 데이터가 insert되지 않는 에러가 발생했다. 에러의 내용은 아래와 같았다. 이 문제를 구글링 해보니 tibero에서 자동 형변환을 지원하지 않아서 NUMBER인 컬럼에 string을 insert 시도하는 것이 문제라고 하는데, 뭔가 내 경우랑 맞지 않는 것 처럼 보였다. 그리고 로컬에서, 개발서버에서도 해당 에러가 재현되지 않고 디버깅을 찍어보아도 insert되는 데이터는 정상이었다. 문제는 바로 INSERT를 수행하기 전 key 값을 sql로 채번하는 것이었다. mail_queue 테이블의 PK인 메일 id( mail_id )값을 기존의 테이블의 mid값 중 max값을 불러와 여기에 1을 더한 뒤에 insert하는 데, DB의 mid값에 특수기호가 들어있던 것이 문…

March 28, 2022
Error
[Error] Getter가 없어서 발생하는 JSON Serialize 에러

Type definition error: [simple type, class stg.onyou.service.CursorResult]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class stg.onyou.service.CursorResult and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: stg.onyou.model.network.Header[“data”])“, RestController에서 return 시 객체를 json으로 serialize하는데, 이 때 객체의 멤버 중에 Getter가 없는 멤버 변수가 있어서…

March 27, 2022
Error
[JPA] 8. JPA프록시와 지연로딩(Lazy Loading)과 즉시로딩(Eager Loading)

1. JPA에서 프록시란 무엇인가? 1) em.find vs em.getReference em.find를 하게 되면 JPA가 실제 entity 객체를 반환하지만, em.getReference를 하게 되면 DB조회를 미루는 ‘프록시’ entity 객체를 반환한다. 프록시 객체는 실제 Entity 타깃 객체는 가지고 있지 않고, id값만 가지고 있는 비어있는 객체이다. 프록시 객체는 실제 Entity를 상속해서 만들어지며, Hibernate가 내부적으로 만든다. 실제 클래스와 겉 모양이 같기 때문에 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용할 수 있다. 프록시 객체는 실제 객체의 참조(target)를 보관하고, 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 이렇게 호출을 한다고 생각해보자. getName 호출하게 되면 MemberProxy객체에 target이 없기 때문에 JPA가 영속성 컨텍스트에 진짜 Member객체 가져오라고 초…

March 24, 2022
Spring
[JPA] 7. 상속관계 매핑 전략 (슈퍼타입, 서브타입)

JPA에서 엔티티 간에 다양한 연관관계를 매핑하는 방법에 대해서 알아보았다. 이제는 조금 더 나아가 단순히 다대다, 다대일만의 관계가 아니라 JPA에서 상속관계를 어떻게 매핑하는 지에 대해서 알아보고자 한다. 그런데 생각해보면 관계형 데이터베이스에는 ‘상속’이라는 개념이 객체지향과는 달리 존재하지 않는다. 그렇지만 이와 유사한 슈퍼타입, 서브타입 모델링 기법이 있는데, JPA에서는 이를 사용해서 객체의 상속관계를 DB의 슈퍼타입/서브타입 관계로 매핑시켜준다. 그리고 관계형 DB에서 슈퍼타입/서브타입 논리 모델링을 물리 모델링하고자 할 때 구현하는 방법은 크게 3가지이며 이 3가지 방식 중 어떤 방식을 선택해도 JPA에서 연관관계 매핑을 지원한다. 1. 조인 전략 앨범 데이터 INSERT시 ITEM, ALBUM 테이블 각각에 데이터를 넣고 조회 시는 ITEM_ID로 ITEM, ALBUM을 조인해서 가져오는 방식이다. 이 때 ITEM 테이블에 어떤 서브타입인지를 구분하는 DTYPE…

March 20, 2022
Spring
[JPA] 6. 다양한 연관관계 매핑

JPA에서 제공하는 다양한 연관관계 매핑하는 방법에 대해서 알아보기에 앞서, 연관관계를 매핑할 때 고려해야 할 요소는 3가지임을 기억하자. 다중성 @ManyToOne -> 제일 많이 사용된다. @OneToMany -> 사용할 수는 있지만 ManyToOne의 양방향으로 커버 가능하다. @OneToOne -> 가끔 @ManyToMany ->실무에서 안 씀 단방향인가 양방향인가 연관관계의 주인이 어느 쪽인가 1. 다대일( ManyToOne ) 다대일 관계는 가장 많이 사용되는 관계이다. 사실 상 거의 이것으로만 설계할 수 있다. 다대일 관계의 특징은 FK를 ‘다’ 쪽에서 관리하는 것이고, 연관관계의 주인도 ‘다’ 쪽이라는 것이다. 1. 단방향 2. 양방향 설계는 다대일 단방향에서 끝났지만 만약에 Team 에서도 Member에 대한 조회를 하고 싶다면 OneToMany를 ‘일’ 쪽인 Team에 추가하여 매핑해주면 된다. 연관관계의 주인은 Member이므로 조회만 된다는 점에 유의하자. …

March 16, 2022
Spring
[JPA] 5. 연관관계 매핑 (feat. 연관관계의 주인)

JPA 연관관계 매핑을 배우기에 앞서, 객체와 테이블의 연관관계를 맺는 방법이 다르다는 것을 이해해야 한다. JPA 1. 에서 언급했듯이, 객체는 참조를 통해, 테이블은 FK를 통한 조인으로 연관관계를 맺는다. 회원과 팀이 다대일 관계일 때 객체를 테이블에 맞추어 모델링 한다면 아래와 같을 것이다. 그리고 이렇게 Entity 상에서 이렇게 매핑을 하게 되면 서로 연관된 데이터를 가져오고 싶을 때 이렇게 Id를 통해서만 가져올 수 있게 된다. 그리고 이것은 객체지향스럽지 않은 방식이다. JPA에서는(ORM에선) 이를 어떻게 모델링 할 수 있을까? JPA에서는 단방향, 양방향 연관관계를 통해 객체지향적으로 프로그래밍이 가능하도록 해준다. 1. 단방향 연관관계 Entity 클래스에서 참고하고자 하는 다른 Entity 클래스의 참조형을 멤버변수로 선언하는데, 이 때 참조형으로 생성하는 Entity는 FK를 가지고 있지 않은 쪽 ( ‘Many’ 인 쪽 ) 이다. 즉 Team과 Membe…

March 12, 2022
Spring
[JPA] 4. 엔티티(Entity) 매핑 기초

JPA의 내부동작, 즉 영속성 컨텍스트의 정의, 장점, 라이프사이클 등에 대해서 이전 글을 통해 알아 봤다면, 이제 Entity 매핑을 실제로 어떻게 하는 지를 알아보자. 1. 객체와 테이블 맵핑 ( @Entity, @Table ) @Entity가 붙은 클래스는 JPA가 관리하게 된다. Entity 작성 시 주의사항 기본 생성자는 필수이다. final, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @Table은 엔티티와 맵핑할 테이블 지정 가능 2. DB 스키마 자동 생성 JPA에서는 DDL을 앱 실행 시점에 자동 생성해준다. ( 운영 환경에서는 사용하면 안됨 ) : JPA가 테이블 중심이 아닌 객체 중심임을 보여준다. persistence.xml에서 아래와 같이 옵션이 설정되어 있어야 한다. 여기서 value값에 옵션을 지정해주는데 옵션의 종류는 아래와 같다. create : 기존테이블 삭제 후 다시 생성(DROP + CREATE)…

March 08, 2022
Spring
[JPA] 3. JPA 내부동장 방식 : 영속성 관리

지난 글에서는 JPA 프로그래밍시, EntityManager를 생성하여 persist, set 등의 CRUD 작업을 수행하는 것을 알아보았다. 지난 글에선 설명하지 않았지만 EntityManager가 데이터를 persist 하게 되면 데이터는 ‘영속성 컨텍스트’에 저장되게 된다. JPA에서 가장 중요한 것은 객체와 관계형 DB의 맵핑 문제, 그리고 영속성 컨텍스트이다. 영속성 컨텍스트란? 영속성 컨텍스트를 이해하기에 앞서, EntityManager(이하 EM)와 EntityManagerFactory(이하 EMF)가 동작하는 방식에 대해서 먼저 이해해야 한다. EMF는 고객의 요청이 올 때 마다 EM을 생성하고 EM은 내부적으로 DB 커넥션을 사용해서 DB를 사용한며, 이를 도식화하면 아래와 같다. 그렇다면 영속성 컨텍스트란 무엇인가? “Entity를 영구 저장하는 환경”이라는 뜻이다. 영속성 컨텍스트는 논리적인 개념이며 또한 EM과 1대1로 대응하고, EM을 통해 접근/관리 한다…

February 27, 2022
Spring
[JPA] 2. JPA 구동방식과 JPQL의 개념

JPA 구동 방식 JPA는 아래와 같은 방식을 통해 동작한다. EntityMangerFactory는 하나만 사용해서 앱 전체에서 공유해서 사용하며 EntityManager는 thread간에 공유해서는 안된다. 그리고 JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. ​ 순수 JPA만 설정했을 때 어떤 식으로 프로그래밍을 하게 되는 지 아래 코드를 통해서 살펴보자. EntityManagerFactory를 생성하고, 이를 통해 EntityManager도 생성한다. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되야 하기 때문에 EntityTransaction 객체를 생성하여 tranasaction의 begin, end를 관리해주어야 한다. ​ 아래 코드에서 순수 Jpa 프로그래밍을 어떻게 하는 지 알 수 있다. 특히 jpa에서 제공하는 수정 기능을 보면 jpa를 사용하면 정말 객체지향적으로 프로그래밍할 수 있음을 알 수 있다. setName 메소드를 통해서 Entity…

February 25, 2022
Spring
[JPA] 1. SQL 중심적 개발의 문제와 JPA

오늘 날 DB를 사용한다고 할 때 아직까지 대부분은 NoSQL보다는 RDB라고 불리는 관계형 데이터베이스를 사용한다. 즉, 개발자는 프로그래밍을 할 때 객체를 DB에 저장하는 작업, 반대로 DB를 객체로 불러오는 작업을 반복해야 만 했다. 개발자가 사실 상 SQL mapper 역할을 했어야만 했다는 것을 말한다. 실제 국내에서는 수 많은 개발업체들과 SI업계에서는 여전히 Mybatis를 사용하며 SQL에 대부분의 비즈니스 로직이 녹아 있다. 그렇다면 이러한 SQL 중심적 개발에는 어떤 문제가 있을까? 쉽게 생각할 수 있는 것은 SQL을 직접 짜는 것이 매우 귀찮은 반복적 작업이라는 것. 예컨대 필드가 추가 되면 INSERT, UPDATE, SELECT등 모든 SQL에 해당 필드가 들어가야 하는 곳을 찾아서 추가해주어야 할 것이다. 그러나 무엇보다도 RDB(관계형 데이터베이스)와 OOP(객체지향 프로그래밍)의 패러다임 불일치에서 오는 문제들이다. 패러다임의 불일치 관계형 DB가 나온…

February 24, 2022
Spring
OAuth 란? OAuth 개념 및 동작원리(feat. 생활코딩)

OAuth는 어떤 시스템에서 그 시스템의 사용자들이 Google, Facebook, KaKao talk과 같은 서비스에 직접 연결하지 않고도 시스템을 통해 각 서비스(Google,Facebook등) 의 기능을 이용하고 싶은 욕구로 인해 등장한 개념이다. 이 때 시스템이 사용자들의 서비스 계정정보를 모두 가지고 있다면 해당 문제가 쉽게 해결 되겠지만, 그것은 보안 상 매우 취약한 방법이다. 왜냐하면, 사용자 입장에서는 처음 보는 시스템에 자신의 카카오 계정정보를 맡겨야 되는 것이고, 시스템 입장에서도 사용자들의 카카오 계정정보를 가지고 있는 것 자체가 부담이다. 서비스 입장에서도 자신들의 사용자 정보를 신뢰할 수 없는 ‘시스템’에게 맡기는 것은 말도 안된다. 그래서 우리에겐 OAuth가 필요하다.​ OAuth에는 앞서 말한 것처럼 사용자, 시스템, 서비스 3가지의 주체가 있고, OAuth에서는 이를 각각 Resource owner(사용자), Client(시스템), Resource …

February 23, 2022
WEB
Spring Swagger 사용하여 API 문서 자동화하기

Spring boot를 사용해서 사이드 프로젝트를 하던 중에 다른 개발자들과의 협업을 위해 API를 문서화시키는 것에 대한 필요성이 있었는데 Swagger를 사용하여 별도의 문서 작성없이 소스상의 간단한 설정을 통해 API 문서 자동화를 구현했다. API 문서 자동화 방법은 아주 간단한데, Gradle의 경우 아래를 build.gradle의 dependenceis에 추가해주면 된다. Maven의 경우 아래를 pom.xml에 dependency에 추가해주면 된다. 이렇게만 하면 되는데, Spring boot 2.6 버전을 쓰는경우에는 NPE가 발생할 수 있다. Spring에서 디폴트로 PathPattern-based matching을 사용하는데, Springfox에서는 Ant-based path matcher가 사용되는 것으로 가정하고 있기 때문에 문제가 발생한다고 한다(https://stackoverflow.com/questions/70036953/springboot-2-6-0-…

February 19, 2022
Spring
[Java] 어노테이션이란(Annotation)? 커스텀 어노테이션을 만들어 보자

어노테이션이란 무엇인가? 어노테이션은 자바에서 compile, run타임 시 코드를 어떻게 처리할 것인 지에 대한 메타데이터라고 볼 수 있다. 어노테이션의 목적 컴파일러에게 문법 에러를 체크하기 위한 정보 제공 (ex. @Override ) 개발 툴에서 코드를 자동으로 생성할 수 있는지 정보 제공 런타임 시 특정 기능을 실행하기 위한 정보 제공 ( ex. @Controller) 커스텀 어노테이션 만들기 선언 아래와 같이 MyAnnotation을 간단하게 생성할 수 있다. Element 멤버 외부의 값을 입력받을 수 있게 하는 역할 element 선언 아래와 같은 형태로 element 타입, 이름, default값을 설정하여 선언할 수 있다. 물론 default 값은 생략 가능하다. 그리고 이 어노테이션을 외부에서 쓸 때, 아래와 같이 element값을 지정할 수 있다. 기본 element : value 어노테이션에는 value라는 기본 element가 존재하며 아래와 같이 설정할 …

February 17, 2022
Java/Kotlin
[디자인 패턴] 3.State 패턴

State 패턴에 대한 UML을 보자마자 든 생각은 ‘어? 이거 Strategy 패턴과 똑같은데?’ 라는 생각이었고, State 패턴에 대한 설명을 듣고 나서 든 생각은 ‘어? 이거 옛날에 Logic design 수업에서 배운 FSM(Finite State Machine)과 비슷하네?’ 라는 생각이었다. 그리고 실제로 FSM 개념을 프로그래밍적으로 구현한 것이 State패턴이다. UML은 Strategy패턴과 사실상 같다고 볼 수 있다. Context 클래스에서 State interface 객체를 가지고 있고, State과 관련된 행동을 State class에게 위임한다. 그렇다면 Strategy와 다른 점은 무엇일까? Strategy 패턴은 공통적 성격이 있는 여러가지 기능을 특정 메소드에서 모드에 따라 다르게 실행되도록 하는 것이라면, State 패턴에서는 특정 메소드가 실행될 때 모드에 따라 다르게 실행되는 점은 동일하지만, 특정 조건에서 모드를 전환시킨다는 점에서 다르다…

February 12, 2022
디자인패턴
[디자인 패턴] 2.Strategy 패턴

Strategy(전략) 패턴의 정의와 UML은 아래와 같다. “여러가지 알고리즘을 하나의 추상적인 접근점(interface)을 만들어 접근점에서 교환 가능하도록 하는 패턴을 Strategy 패턴이라고 한다” Strategy 패턴을 이해하기 위해서는 먼저 interface에 대한 이해, 그리고 delegation에 대한 이해가 필요하다. interface는 객체지향 프로그래밍에서 기능에 대한 선언과 구현을 분리하며 기능을 사용하기 위한 통로를 제공한다 Delegation은 특정 객체의 기능을 사용하기 위해 다른 객체의 기능을 호출하는 것을 말한다. 아래 코드를 보면 금방 이해가 될 것이다. 이제 interface와 delegation에 대해 이해 했으니 다시 돌아가서 Strategy 패턴이 무엇인지 예를 통해 알아보자. 예제 : 게임 캐릭터의 공격 구현 전략 이제 이를 사용하는 게임 캐릭터 클래스를 만들어 보자. GameCharacter 클래스에서는 외부에서 ‘장착’ 시켜준 wea…

February 11, 2022
디자인패턴
[디자인 패턴] 1.Singleton 패턴

싱글톤 패턴의 정의와 UML은 아래와 같다. “소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다” 다르게 말하면 프로세스가 실행될 때 한 번만 메모리를 할당하고 해당 메모리에 인스턴스를 만들어서 전역에서 공유하기 위한 패턴이다. 클래스에 딱 하나의 인스턴스만 존재해야 되고, 어플리케이션 전역적인 접근이 필요한 경우에 이를 사용한다. 정의에서는 ‘생성자가 여러 차례 호출되더라도’ 라고 표현했지만, 실제 싱글톤 클래스(A 클래스라고 하자)를 구현할 때는 애초에 외부에서 인스턴스를 생성할 수 없도록 생성자를 private으로 두고, 클래스 안에서 A를 타입으로 하는 static 변수에 static 메소드인 getInstance 메소드를 통해 인스턴스를 생성하…

February 10, 2022
디자인패턴
[Git] Personal access token 이용하여 github remote 인증하기 in Mac

로컬에서 Github repo 로 push 할 때 이제는 깃헙계정 패스워드가 아닌 Personal access token을 입력하도록 한다. 근데 매번 이걸 입력하기는 너무 귀찮으니, personal access token을 발급 받아 로컬 키체인에 저장해두면 된다. personall access token 발급은 계정 setting - developer setting - personal access token 에서 generate하면 된다. 해당 토큰은 디바이스 별로 하나씩 생성하는 것이 좋을 듯하다. 나 같은 경우는 아래와 같이 ‘mac’ 이란 이름으로 토큰을 만들었고 repo에 대한 권한만 주었다. 그 후 command + space 하여 ‘keychain Access’ 를 열어서 아래와 같이 깃헙의 주소와 나의 깃헙 계정명을 적은 후 암호 란에 토큰 값을 복붙해주면 된다. 마지막으로 맥 터미널을 열어서 아래 명령어를 통해 키체인을 로컬 git에 등록해주면 끝이다.

February 09, 2022
DevOps
[AEM] Adobe Experience Manager

AEM 을 소개함에 있어 해당 과정은 Udemy의 https://www.udemy.com/course/adobe-experience-manager-63 과정을 영어가 어려운 사람들을 위해 한국어로 정리하는 데 목적이 있음을 밝힌다. AEM 관련해서 체계적으로 정리해둔 블로그를 찾지 못했기 때문이기도 하다. AEM 소개 AEM은 ‘Adobe Experience Manager’ 의 약어이며, 어도비 사에서 만든 Java 기반의 CMS 솔루션이다. AEM은 상용 웹 사이트를 만드는 데 많이 사용되며 웹 사이트의 콘텐츠와 asset 들을 관리하기에 용이하며 배포까지 지원한다. 웹사이트와 CMS 웹 사이트에는 3가지 종류가 있다. Static 웹 사이트 : 정적 리소스로만 이루어진 웹 사이트이다. Dynamic 웹 사이트 : 클라이언트/서버의 스크립트를 통해 동적으로 웹 사이트의 콘텐츠를 관리하는 웹 사이트이다. CMS template을 생성할 수 있다 재사용 가능한 Component를 생…

February 07, 2022
WEB
Spring boot 개발환경 설정 (gradle,JPA,MySQL,EC2,RDS)

1. AWS에서 프리티어로 EC2와 RDS 발급하기 1) EC2 인스턴스 발급 AWS 에 들어가서 EC2 인스턴스 생성하기로 가서 생성하면 된다. 프리티어로 발급 가능한 인스턴스를 발급 받았다. 발급 시 신경 써 주어야 할 부분은 프리티어에서 사용 가능한 최대 스토리지 설정(30GB)과 보안그룹에서 규칙을 설정하는 것이다. 보안그룹을 설정하지 않으면 생성한 EC2 서버로 모든 통신이 불가능하기 때문에 필요한 port와 사용자에 대해 꼭 설정해주어야 함! 나는 Front/Back-end를 위해 각각 3000,8080포트를 모든 사용자에게 허용하고 http,https를 통한 접근 허용을 위해 80,443 포트도 열어두었다. 2) EC2 ssh 접속 테스트 Windows에선 putty 설치해서, Mac에선 ssh 커맨드라인 툴을 이용해서 ssh priavte key를 사용해서 접속하면 된다. 계정명은 ubuntu로 초기 로그인이 되며 su 명령어를 통해 root로 유저를 변경하여 roo…

February 04, 2022
AWS
[REST API] HTTP Status Code 제어와 예외 해들링(Exception handling)

Http Status Code 제어 REST API를 통해 User를 생성하는 API를 만드는 상황을 가정해보자. 좀 더 나은 API 설계를 고려한다면 단순히 User를 생성만 하는 것에서 그칠 것이 아니라 요청자에게 response로 결과 데이터를 반환해주어야 할 것이다. 가령 사용자에게 요청 값을 반환해 주기 위해 ServletUriComponentsBuilder 라는 클래스를 사용할 수 있다. 이렇게 하면 클라이언트는 Header로부터 200을 받는 것이 아니라 201 created 값을 반환받을 수 있게 되며 header의 Key값 중 location값에서 POST의 URI value를 알 수 있다. 여기선 http://localhost:8080/users/10 이 될 것이다. 이렇듯 200 OK로만 보내는 것이 아니라 CRUD에 따라, 그리고 여러가지 상황에 따라 서로 다른 HTTP status code값으로 응답해주는 것이 좋고, location값을 반환 해 줌에 따라 …

February 04, 2022
WEB
[Spring] Spring boot는 무엇을 해주는가? 스프링 부트를 쓰는 이유

Spring을 이용해서 개발을 시작한다고 할 때 대부분의 개발자들은 Spring boot를 이용할 것이다. Spring boot를 활용하게 되면 Spring 사용 시 필요한 여러가지 귀찮은 configuration들을 자동으로 설정해줄 뿐만 아니라 개발자비즈니스 로직 개발에 집중할 수 있도록 여러가지 기능을 제공한다. Spring boot란 무엇인가? 간략하게 정의하면 Spring boot는 Spring framework 을 더 쉽게 사용할 수 있게 해주는 framework로 보면 된다. Spring은 사용하기 위해 필요한 설정 들이 생각보다 복잡한데, Spring boot는 기본적으로 이러한 설정들을 모두 제공하기 때문에, 개발자 입장에서는 초기 개발 환경을 셋팅하는 것이 매우 용이해진다. Spring boot 공식 문서는 다음과 같이 말한다. Spring Boot makes it easy to create stand-alone, production-grade Spring ba…

February 02, 2022
Spring
[Error] h2 데이터베이스 실행 문제 in mac

h2를 설치해서 bin폴더 내에서 ./h2.sh를 실행했으나 permission denied로 뜸. -> chmod 755 h2.sh 또는 chmod +x h2.sh를 통해 해당 파일에 실행권한 부여. ./h2.sh 하니깐 웹 브라우저 상에서 실행되었으나 아래와 같이 연결할 수 없다고 나옴. url중 ip부분을 localhost:8082로 변경하고 테스트하면 아래와 같이 잘 나오는 걸 확인할 수 있었다.

February 01, 2022
Error
SOAP에 대한 이해. SOAP이란 무엇인가? (feat. REST vs SOAP )

REST와 대비하여 자주 언급되는 SOAP이라는 개념이 있다. SOAP이란 무엇인가? Simple Object Access Protocol의 약자로서 http,https,smtp를 이용하여 XML메시지로 통신을 가능하게 해주는 프로토콜을 말한다. 아래 그림과 같이 XML로 request를 보내고 XML로 response를 받는다. 그리고 그 XML 메시지의 구조는 아래와 같이 Envelope, Header, Body의 세 부분(+Fault 부분 option)으로 이루어져 있다. 실제 SOAP의 메시지 구조를 살펴보면 아래와 같다. 전달하고자 하는 내용에 비해 부가적인 태그나 설정 관련 텍스트가 많아서 통신 시 불필요한 오버헤드가 발생할 뿐만 아니라 개발 하기에 까다롭기도 하다. SOAP vs REST SOAP과 REST의 차이점을 아주 잘 보여주는 표가 있어서 가져와보았다. SOAP와 REST의 공통점이라고 한다면 HTTP,HTTPS를 통해 데이터를 통신한다는 점이지만 …

January 31, 2022
WEB
[Spring] Autowired가 아닌 생성자 주입을 사용해야 하는 이유

Spring에서 의존관계 주입(Dependency Injection)을 할 때 @Autowired를 사용하여 주입하는 경우가 많은데, 스프링에서는 아래와 같이 그렇게 하지 말 것을 권고한다. Field injection is not recommended … Always use constructor based dependency injection in your beans DI를 하는 이유는 객체 내부에서 객체를 직접 생성하는 방식 보다 런타임 시 외부에서 생성한 객체를 인터페이스를 통해 넘겨받는 것이 더 느슨한 결합 방식이기 때문이다. DI 방법 3가지 1. Setter based injection (수정자 주입) 위와 같이 Setter를 통해 주입하는 방식의 경우 Controller 객체가 생성될 때 반드시 service가 초기화 되지 않아도 되기 때문에, NPE 발생 가능성이 존재한다. 그리고 생성자 주입과 필드 주입 방식은 ‘객체가 생성되는 시점’에서 순환 참조가 되는 지 여부…

January 28, 2022
Spring
[Error] React native SDK location not found

React native 프로젝트에서 npm run android 했을 때 .zshrc에 Android root 설정했음에도 SDK location not found가 나오는 경우, project root/android/에 local.properties 를 생성해서 아래 행을 추가 해주면 된다 . Mac : sdk.dir=/Users/{user_name}/Library/Android/sdk Windows : sdk.dir=c:\Users{user_name}\AppData\Local\android\adk ​

January 26, 2022
Error
[Error] JPA MYSQL "You have an error in you SQL syntax"

User와 Feed의 다대다 관계 매핑을 위해 ‘Like’라는 이름의 Entity를 만들었는데, like가 MySQL에서 사용하는 예약 키워드이다 보니 Syntax 에러가 발생했던 것. 해결책 : Like 대신 다른 이름을 사용하자. 그리고 엔티티명으로 예약어를 사용하는 것을 조심하자. MySQL 의 예약어들은 아래와 같다. ​

January 26, 2022
Error
REST API란 무엇인가? REST API 제약조건, 실용적인 REST API 설계 방법 ( feat. RESTful하다는 것 )

REST에 대해서 웹 문서들을 살펴보면 여러가지 표현들로 설명하고 있는데, 그것을 조합해서 내가 이해하기 쉽게 정의하자면 아래와 같다. “REST API란 HTTP Method를 사용하여 HTTP URI 형태로 명시된 리소스를 처리(CRUD) 하도록 설계된 클라이언트와 서버 간의 통신 방식이다” 클라이언트가 GET, POST, PUT, DELETE 등의 HTTP 메소드를 통해 URI로 서버에 요청하게 되면 서버는 해당되는 리소스에 대한 CRUD를 처리하고 클라이언트에 JSON 데이터를 반환한다. REST API의 구성 요소 1. Resource : REST에서는 resource의 정보를 표현할 수 있어야 하며 이를 위해 URI를 사용한다. 2. Method : resource에 대한 행위를 표현하며, HTTP의 GET(조회), POST(추가), PUT(수정), DELETE(삭제) 메소드를 사용한다. 3. Representaion : REST에서 representation(표현)이…

January 25, 2022
WEB