letsmakemyselfprogrammer의 등록된 링크

 letsmakemyselfprogrammer로 등록된 티스토리 포스트 수는 119건입니다.

[논문 리뷰] Block-STM : Scaling Blockchain Execution by Turning Ordering Curse to a Performance Blessing [내부링크]

Authors : Rati Gelashvili, Alexander Spiegelman, Zhuolun Xiang, George Danezis, Zekun Li , Dahlia Malkhi ACM CCS 2022 Background & Purpose Diem blockchain 에서의 연구 합의 단계에서 leader validator 가 블럭(proposed block)을 하나 만들어냈다고 가정하고, 그 블록을 입력을 받는 상황. 블럭 내의 트랜잭션들을 검증하기 위해서는 모든 트랜잭션을 순차적으로 실행시켜야하는데, 이를 최적화하는 방법에 대한 논문. Key ideas 입력 받은 블럭의 트랜잭션 순서를 그대로 유지(preset order)하면서, 병렬적으로 수행하고자 함. (in memory executio..

정보보안 랩실 학부연구생 기록 (6개월) [내부링크]

[ 2022년도 여름방학 ] [ 2022년도 2학기 ]

[대학원] 포스텍 컴퓨터공학과 합격 후기 (자소서 첨부) [내부링크]

포스텍 블록체인 랩실 합격 후기입니다. 준비하시는 분들에게 도움이 되고자 작성합니다. 저는 9월 초에 뒤늦게 대학원 진학 고민을 시작해서, 학기가 시작된 후에 급하게 입시 준비를 했습니다. 이미 카이스트는 접수가 끝난 상태였고, 포스텍이나 서울대를 생각했는데, 블록체인 관련해서는 포스텍이 더 좋은 선택 같아서, 포스텍 아니면 취업해야겠다는 마인드로, 포스텍 하나만 원서를 넣었습니다. 그래서 다른 대학원과는 비교를 해드릴수 없다는 점 참고해주시면 되겠습니다. 개인적으로 포스텍 입시는 두단계가 있다고 생각합니다. 첫번째는 포스텍 컴공과 자체 입시와, 두번째로는 지도교수 컨택이 있습니다. 학부 자체의 입시를 통과하기 위해서는 학부 성적이 어느정도 나오고, 전공 시험만 잘 봐도 무난하게 통과하는 것 같습니다. ..

[회고] - 2022년 [내부링크]

2022년도에는 인생의 큰 방향을 결정하는 선택이 있었다. 평범한 백엔드 엔지니어를 준비하다가, 막학기를 앞두고 블록체인 연구로 급하게 방향전환을 해버렸다. 키워드로 굵직하게 돌아보면 조기졸업 (인하대학교 컴퓨터공학과 최종 학점 4.3x) 교내 빅데이터 동아리 개발팀장 졸업 프로젝트 (블록체인) 정보보안 랩실 학부연구생 (암호학 및 블록체인 관련 프로젝트) 대학원 입학 (포스텍 블록체인 랩실) [상반기] 2022년도 상반기는 여태 해오던 백엔드 엔지니어로의 취업준비를 중단하고, 블록체인 연구개발자의 길로 들어서는 과정이었다. 1) 동아리 내부 개발팀장 (기간 : 01/01 ~ 08/09) 팀장으로 있으면서 크게 2가지를 고민했던 것 같다. (1) 팀 운영 동아리가 요즘 뜨거운 감자인 빅데이터 동아리라서 ..

[Klaytn] 블록체인을 활용한 투표와 의사결정 [내부링크]

블록체인을 활용한 투표와 의사결정(https://if.kakao.com/2022/session/48) 을 보고 정리한 글입니다. 1. Governance 란? 공동의 목표를 달성하기 위해 모든 이해당사자들이 투명하게 의사결정을 수행할 수 있게 하는 장치 블록체인에서는 서비스의 권한을 구성원에게 나누어주고 직접 의사결정에 참여할 수 있도록 하는 것으로 목표로 함. 블록체인 위에서 일어나는 의사결정을 On-chain Governance. 일반적인 전자투표와 다르지 않지만 public blockchain 위에 활용된다면 투명성, 무결성, 부인방지성을 지킬 수 있고, 스마트 컨트랙트를 통해 강제 이행성을 갖는다. 2. DAO 별도의 중앙화된 위계나 서열 없이 스마트 컨트랙트로 작성된 규칙에 따라 동작. 구성원 ..

[Klaytn] 합의알고리즘 [내부링크]

카카오 블록체인 Klaytn의 합의 알고리즘 A to Z (https://if.kakao.com/2022/session/46) 를 정리한 내용입니다. 1. 합의 알고리즘이란? 비잔틴 오류 허용 문제를 해결하며 발전 분산 시스템에서 각 노드 간 데이터 동기화 문제를 효율적으로 해결하기 위해 발전. 비동기 분산 시스템에서 하나의 노드만 장애가 난다면 비잔틴 문제를 해결할 수 있는 분산 알고리즘은 존재할 수 없다는 것이 1985년 증명이 되었다. -> 따라서 네트워크 상황과 어플리케이션 특성을 고려하여 설계하는 것이 중요. 2. 블록체인에서의 합의 알고리즘 기존의 분산시스템과 유사함. 하지만 public blockchain 환경에서는 "외부에서 언제든지 접근하여 동기화를 진행할 수 있다." 는 특성 때문에, ..

[Spring Boot] Jpa 테스트 작성 시 영속성 컨텍스트 관련 주의사항 [내부링크]

테스트용 엔티티를 돌려쓰지 말 것! 테스트 코드를 작성하다보면 Mock 객체를 매번 생성해주어야한다. @DataJpaTest 를 통해 트랜잭션 테스트를 진행하다보면 유독 많이 사용되는 객체가 존재한다. 예로 회원서비스는 대부분의 서비스가 의존하고 있기 때문에 회원 엔티티를 Mocking 하는 경우가 아주 많다. 만약 @BeforeAll 과 같은 메서드를 사용하거나, 테스트 클래스 변수 선언을 통해, Member 엔티티를 단 하나 생성하고, 테스트 메서드간 돌려 쓴다면, 테스트가 의도치 않게 실패할 수 있다. 또 테스트가 실행되는 순서에 따라 서로 논리적인 의존성이 발생하기도 한다. 그 이유는 다음과 같다. @DataJpaTest 어노테이션은 내부에 @Transactional 이 붙어서 테스트가 하나 끝나..

EIP-1155: Multi Token Standard [내부링크]

노션에 정리한 내용이 더 가독성이 좋음. EIP-1155: Multi Token Standard [목차] fragrant-comfort-49c.notion.site [Summary] EIP-20, EIP-721 은 한가지 종류의 토큰에 대한 인터페이스를 정의한다. 즉 해당 인터페이스로는 하나의 컨트랙트는 하나의 토큰만 다룰 수 있다. EIP-1155는 하나의 컨트랙트에서 여러개의 토큰을 다루는 것에 대한 표준 인터페이스를 제공한다. [Specification] 1) ERC1155 Interface code 2) Token Receiver code 3) Safe Transfer Rules ⇒ safeTransferFrom 과 safeBatchTransferFrom 는 ERC1155TokenReceiver ..

EIP-721: Non-Fungible Token Standard [내부링크]

Abstract 스마트 컨트랙트 내에서 NFT의 표준 API 인터페이스를 규정. 표준 API는 NFT를 교환하고 기록하기 위한 기본적인 기능을 제공한다. NFT는 다음과 같은 다양한 디지털 또는 물리 자산에 대한 소유권을 나타낼 수 있다. 물리 자산 - 집, 예술 작품 등 수집품 - 유일성이 보장되는 수집용 카드 등 대출과 같은 마이너스 자산 등 NFT는 구별 가능한 디지털 토큰으로서 각 자산에 대해 개별적으로 소유권을 추적할 수 있도록 한다. Specification ERC-721를 따르는 컨트랙트를 만들기 위해서는 ERC721, ERC165 인터페이스를 반드시 구현해야한다. 어플리케이션은 지갑 인터페이스를 구현해야한다. (Optional) 토큰 이름과 상세 정보를 외부에 제공하도록 메타데이터 인터페이..

비트코인이란? (Bitcoin WhitePaper 정리) [내부링크]

첨부된 비트코인 백서(White paper)를 읽고 정리한 내용입니다. 1. Intro 전통적으로 전자상거래를 사용하기 위해서는 ‘신뢰할 수 있는 제3의 금융기관’이 필수적이었다. 이는 이중지불 문제를 해결하기 위함인데, 자산을 한 번 소비하면 동일한 자산을 다시 다른 곳에 사용할 수 없도록 보장해야하는 문제이다. 즉, ‘제 3의 기관’이 이중지불 문제를 해결함으로써, 전자화폐로서의 기능을 보증한다. 하지만 블록체인은 이중지불 문제를 순수하게 peer-to-peer 네트워크를 통해 해결하는 법을 제시한다. 해시 기반 작업증명 방식을 통해 거대한 체인이 자라난다. 이 거대한 체인은 그 자체로 거래내역 장부의 무결성을 보장하고, 시장 참여자들의 cpu 가 계속 작업하도록 유도함으로써 위변조 공격을 방지한다...

[SpringBoot] 9. OSIV 설정을 통한 쿼리 최적화 방안 고찰 [내부링크]

[배경] 기존 시큐리티 필터에서는 Role-based access control를 담당하고 있다. [관리자등급 -> 운영진 -> 일반회원] 과 같은 역할기반 접근 제어 말고, 다른 특성으로 권한을 검사해야하는 경우가 있다. 예를 들어, 강의를 개설한 뒤에 강의자만 접근할 수 있는 api 가 있다면 매번 데이터베이스에 쿼리를 날려서 강의자인지 확인하고 인가를 해주어야한다. [문제] 위와 같이 해도 주요 기능은 제대로 수행하고 있지만, 트랜젝션이 2번 실행되는 점을 고려해야한다. 트랜젝션이 끝나면 영속성 컨텍스트에서 관리되던 엔티티들은 detached 되어 다른 트랜젝션이 수행될 때는 다시 db로부터 조회해서 영속화를 또 해주어야하는 중복이 발생한다. 강의실 정보를 수정하기 위한 api를 호출할 때, 강의자..

[SpringBoot] 8. 하이버네이트 원격서버 암호화 연결 (SSH tunneling 설정) [내부링크]

[배경] 개발 서버를 따로 운영하고 있다. 따로 로컬에서 db 작업하고 다시 개발서버로 적용하는 일이 번거로워서 애초에 개발서버에서 db 작업 후 바로 적용한다. 기존에는 개발용 데이터베이스를 학교에 두고 사용했다. 근데 종종 전원이 꺼지거나, 랜선이 뽑히는 등의 일이 발생해서 직접 학교에 가서 일일이 작업해야하는 소요가 있었다. 그래서 개발용 db 도 aws로 옮겨버렸다. 하지만 암호화를 사용하지 않고 db 연결해서 사용하면, (예로 3306포트로 다이렉트 연결할 경우) 패킷에 평문이 그대로 노출되기 때문에 종단간 암호화를 해주어야한다. 따라서 ssh tunneling 을 이용해서 공개키 암호화 방식의 프로토콜을 이용하되, aws 상에서 forwarding 을 해주어 db로 연결하도록 했다. [연결 개..

타원곡선암호 연산 파이썬 구현(ECC, P-192) [내부링크]

Implementing Elliptic Curve Cryptography operation in Python on the Curve P-192 P-192 곡선 파라미터 선언 # define P-192 parameters p = 2 ** 192 - 2 ** 64 - 1 a = -3 b = 0x64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1 n = 0xFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831 gx = 0x188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012 gy = 0x07192B95FFC8DA78631011ED6B24CDD573F977A11E794811 WeierStrass Form de..

[SpringBoot] 7. SpringSecurity 인증 모듈 개발 (OAuth2, jwt, 소셜로그인) [내부링크]

SpringSecurity, OAuth2.0, JWT, Session 등, 까다로운 개념이 많아서 개인적으로는 공부하는데 시간이 꽤 걸렸습니다. 프로젝트를 진행할 때마다 인증 서비스 코드를 작성하는 시간을 줄이면 좋겠다는 생각에 다른 프로젝트를 진행하더라도 언제든지 가져다 쓸 수 있는 인증 모듈을 제작해보고자 했습니다. 확장가능하고 유지보수 가능한 구조에 대해 고민 독립적인 모듈로서의 기능 회원서비스를 의존하지 않도록 하려는 고민 내가 다른 프로젝트를 진행하더라고 바로 가져다 사용할 수 있게끔 하려는 고민 위의 고민들을 통해 완성되었으며 현재는 IBAS 동아리 홈페이지에 적용되어 있습니다. 1. 인증모듈 코드 https://github.com/InhaBas/Inhabas.com-api/tree/dev G..

[컴퓨터 보안] 수업 필기 [내부링크]

CIA와 접근제어 DLP와 소인수분해 문제 & 고전암호 유한체와 AES block cipher Block Cipher Mode와 Stream Cipher 웹 해킹과 Dos 공개키 (RSA, Diffie-Hellam, Elgamal, ECC) Hash Function과 MAC 전자서명과 인증서 네트워크, 시스템 보안 & 보안장비, 솔루션 AI 보안 & 블록체인

520 Error 해결 (Cloudflare) [내부링크]

다음과 같은 오류가 발생했다. 갑자기 모든 서브도메인까지 접속이 안되는 상황 발생 서버는 건드리지 않았기 때문에, 클라우드플레어 관련 문제라고 판단. 클라우드 플레어 관련 설정이 변할 수 있는 것은, 저번에 설정해놨던 프록시 서버 주소라고 판단. (프록시 요청 시 원래 사용자 ip 복원하기) 클라우드플레어 레퍼런스와 비교해보니 역시나 변경되어 있었다. 프록시 서버 ip 목록을 최신화 하니 잘 작동한다.

[전공생이 설명하는 OS] 메모리 관리 - (2) Virtual Memory [내부링크]

1. 가상메모리란? 각 프로세스에게 큰 전용 메모리를 제공하는 기술. 2. 부분적재 에러코드, 자주 접근되지 않는 코드들까지 한번에 적재할 필요가 있나? Locality, Knuth's estimation : 10%의 코드가 90% 실행시간을 갖는다. 가상메모리도 일종의 캐시. 디스크와 메모리 사이의 캐시 (fetch policy) 그러면 필요한 부분을 언제 올릴건데? (resident set policy) 메모리에 올라와 있는 각 프로세스의 조각들을 어떻게 효율적으로 관리할 것인가? (replacement policy) 메모리가 부족해서 다른 조각들을 쫓아내야할때 어떤 조각들을 쫓아낼것인가? 매핑테이블을 어떻게 관리할 것인가? 보통 paging 과 segmentation 기법을 사용 - 프로세스를 조각..

[전공생이 설명하는 OS] 메모리 관리 - (1) Partition/Page/Segment [내부링크]

1. Memory Management 란? 메모리는 (1) OS(resident monitor, kernel) (2) user 두 부분으로 나뉜다. Uni-programming 환경에서는 user part 에 1개의 프로그램만 적재되고, multi-programming 환경에서는 다수의 프로그램이 적재될 수 있다. Memory management 라는 말은 OS 가 user 가 사용하는 메모리를, 프로세스의 요청에 맞게 분할 및 분배하는 것을 포함한다. 메모리를 할당하는 방식은 프로세스 실행 시점에 따라 크게 두 가지로 분류할 수 있다. static allocation : 프로그램 실행 이전에 미리 메모리를 할당하는 방식 (예, global 변수나 상수 등) dynamic allocation : runt..

AWS 비정상적인 디스크 Ops 잡기 [내부링크]

상황 aws 비용 명세서를 보는데 위처럼 ebs IOps(input/output operations per second)가 갑자기 엄청나게 늘어났다. 이전달까지는 2백만 IOs 안쪽으로 기록됐는데, 이번달은 6천만 IO가 넘어가서 추가요금이 발생하는 상황이었다. 평소보다 30배 이상 증가한 셈이다. 바로 cloud watch 에서 모니터링 지표를 확인했다. 위에서 볼 수 있듯이, 쓰기 처리량이 5월 초부터 증가했다. 반면 평균 쓰기 크기는 줄었다. 종합하자면, 아주 작은 크기의 디스크 쓰기 작업이 자주 발생하고 있는 상황이다. IO 횟수로 과금되는 EBS 특성상 한번 IO 할 때 데이터를 최대한 모아서 한번에 작업하는 것이 유리한데, 매우 비효율적으로 작동하고 있는 셈이다. 로그성 데이터가 초단위로 쓰여..

[전공생이 설명하는 OS] 동기화 - (6) 식사하는 철학자 문제 (코드 포함) [내부링크]

Dining Philosopher Problem 식사하는 철학자 문제는 다익스트라 선생님께서 논문을 통해 제시하신 대표적인 데드락 상황이다. 위와 같이 원형의 탁자에 5개의 포크가 놓여있다. 스파게티를 먹기 위해서는 2개의 포크를 사용해야한다는 규칙이 있다. 이 상황에서 5명의 철학자가 포크를 한 개씩 잡고 데드락에 빠지면 모두가 굶어 죽는 starvation 이 발생한다..! 철학자가 다 굶어죽는 c++ 코드는 다음과 같다. 더보기 #include #include #include #include #define NUM 5 sem_t forks[NUM]; // forks void *philosopher(void*); int main(){ pthread_t threads[NUM]; for(int i=0; i

[전공생이 설명하는 OS] 동기화 - (5) Deadlock [내부링크]

Review 쓰레드(Thread)와 동기화 문제 동기화 - (1) 용어 및 개념정리 동기화 - (2) 상호배제 전략(Mutex) 동기화 - (3) 조건동기화 (pthread 예시) 동기화 - (4) 생산자 소비자 문제 지금까지 race condition 이 발생하는 이유와, 이를 해결하기 위해 다양한 동기화 기법이 필요하다는 점을 설명했다. 특히 이전 포스팅에서는 할당 가능한 자원의 개수를 (0~MAX)개로 제한하는 web server request buffer 를 살펴보면서 `생산자-소비자 문제`(bounded buffer problem) 를 해결해보았다. 이번에는 동기화로 인해 발생할 수 있는 심각한 문제인 교착상태(deadlock)을 알아보도록 한다. 1. Deadlock 이란? 다수의 스레드 또는..

[전공생이 설명하는 OS] 동기화 - (4) 생산자 소비자 문제 [내부링크]

Reviews 쓰레드(Thread)와 동기화 문제 동기화 - (1) 용어 및 개념정리 동기화 - (2) 상호배제 전략(Mutex) 동기화 - (3) 조건동기화 (pthread 예시) 여태까지, 멀티프로세스 또는 멀티쓰레드 환경에서 공유자원을 사용하다보면 race condition 이 발생할 수 있고 이를 해결하기 위해서는 동기화가 필요함을 설명했다. 동기화에는 상호배제(Mutual Exclusion) 전략과 조건 동기화(Condition Synchronization) 전략이 있다. 상호배제는 공유자원을 한번에 하나씩 사용하는데 집중한다. 비슷하지만 조건동기화는 다수의 실행흐름을 제어하는데 더 유리하다. Critical Section에 대기하는 프로세스(또는 쓰레드)를 Ordering 하는 전략이다. 지난..

[전공생이 설명하는 OS] 동기화 - (3) 조건동기화 (pthread 예제 코드 포함) [내부링크]

Review 쓰레드(Thread)와 동기화 문제 동기화 - (1) 용어 및 개념정리 동기화 - (2) 상호배제 전략(Mutex) 이전 포스팅에서 지속적으로 언급했듯이, 멀티프로세스 또는 멀티쓰레드 환경에서 공유자원을 사용하다보면 race condition 이 발생할 수 있고 이를 해결하기 위해서는 동기화가 필요하다. 동기화에는 상호배제(Mutual Exclusion) 전략과 조건 동기화(Condition Synchronization) 전략이 있다. 지난 포스팅까지는 상호배제의 관점에서 동기화를 알아보았다. 상호배제는 공유자원은 한번에 하나씩 사용하는데 집중한다. 비슷하지만 조건동기화는 Critical Section에 대기하는 프로세스(또는 쓰레드)를 Ordering 하는 전략이다. 조건 동기화 조건동기화..

[전공생이 설명하는 OS] 동기화 - (2) 상호배제 전략 (Mutex) [내부링크]

지난 포스팅(동기화 - (1) 용어 및 개념정리)에서 정리했듯이, 동기화는 Critical Section 에 대한 접근 제어를 적절하게 잘 한다는 것이고, 구체적으로 MutualExclusion / Progress / BoundedWaiting 3가지의 requirement를 만족시켜야한다고 언급했다. 이런 특성을 만족시키는 동기화 전략은 (1)상호배제, (2)조건부 동기화 전략이 있는데, 이번 포스팅에서는 상호배제의 측면에서 동기화 기법을 살펴보도록 한다. 상호배제 차원의 동기화 전략은 SW의 방식과 HW의 방식으로 나눌 수 있다. 1. SW approach 크게 1) Peterson의 알고리즘, 2) Interrupt 차단방식 두가지를 예로 들 수 있다. 결론부터 이야기하자면, SW 방식의 동기화 전..

[전공생이 설명하는 OS] 동기화 - (1) 용어 및 개념정리 [내부링크]

동기화 문제가 왜 발생하는지에 대해서는 [전공생이 설명하는 OS] 쓰레드(Thread)와 동기화 문제 의 마지막 단락을 참고해주세요. [동기화 관련 용어] (1) Race Condition : 멀티쓰레드 또는 멀티 프로세스 환경에서 공유자원에 동시에 접근할 때, 의도치 않은 결과를 낳는 것을 race condition이라고 하고 다음과 같은 특성을 갖는다. 근본적으로는 [cpu 스케줄링 + 캐시(레지스터 포함) + non-atomic instruction] 때문에 발생하며, 이를 방지하기 위해서는 공유자원에 대한 동기화가 필요하다. Non-Deterministic : 의도하지 않은 결과를 내는데, 결과를 예측할 수 없다. Reproducible : 재현 가능하다. (2) Critical Section :..

OAuth2 naver 회원 id 형식 문제 (네아로) [내부링크]

로컬 개발하는데, 네이버 회원정보 응답이 다음처럼 왔다. { "resultcode" : "00", "message" : "success", "response" : { "id" : "YxvaJNE49NQj-SH9geGSXWKN116r6dIXIqlfU597RS8", "profile_image" : "https://ssl.pstatic.net/static/pwe/address/img_profile.png", "gender" : "M", "email" : "...", "mobile" : "...", "mobile_e164" : "...", "name" : "..." } 기존 db에 있는 response.id 값은 분명 숫자인데, 갑자기 인코딩 된 값이 들어와서 당황했다. 2021년 5월 1일 이후에 만들어진 o..

RSA 파이썬 구현 (key pair generator) [내부링크]

rsa 는 두 소수의 곱으로 이루어진 어떤 수 n를 소인수분해하는 문제가 어렵다는 점을 이용한다. 따라서 n 이 충분히 큰 수여야하고, n 을 두 소수로 소인수분해할 수 있으면 암호가 깨진다. main 함수 키 쌍을 생성한 후, 암호화 복호화가 잘 이루어지는지 확인한다. """ RSA test """ if __name__ == "__main__": e, d, n = keygen(512) # 512-bits 키 생성 M = 88 # 평문 C = encrypt(M, e, n) # 암호문 MM = decrypt(C, d, n) # 복호화한 평문 if M == MM: print("Example of RSA Algorithm works successfully") print("M={}, PU=({},{}), PR=..

[Java의 정석] 14. 람다와 스트림 [내부링크]

1. 람다식 1) 람다식이란? 메서드의 이름과 반환값 없이, 하나의 식처럼 표현한 것으로 '익명 함수'라고도 한다. int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int) (Math.random()*5 + 1)); // 람다식 더보기 /* int max(int a, int b) { return a > b ? a : b; } */ (int a, int b) -> a > b ? a : b (a, b) -> a > b ? a : b // 타입 추론이 가능한 경우는 타입 힌트를 생략 가능 더보기 a -> a*a // 매개변수가 하나인 경우는 괄호 생략 가능 (int a) -> a*a // 매개변수 타입이 있으면 괄호 생략 불가능 더보기 /* (String name, ..

[RFC 표준] OAuth 2.0를 쉽고 정확하게 알아보자! (기초 개념 및 용어 정리) [내부링크]

[OAuth 프로토콜이란?] 어떤 회사가 자신의 서비스를 운영하기 위해 어떤 리소스가 필요하다고 가정하자. 근데, 해당 리소스를 처음부터 수집하고 가공하는 일은 노력이 많이들기도 하고, 서비스 사용자에게도 불편한 경험이 될 수 있다. 이 때 구글이나 네이버 같은 대기업에서는 당사에서 미리 만들어 놓은 리소스를 사용할 수 있도록 api 를 공개하는 경우가 있다. 이 때 구글, 네이버 같은 기관은 OAuth provider 라고 말한다. 이 리소스는 민감한 정보(사용자의 개인정보 등)를 포함할 수 있기 때문에 안전하게 미리 약속된 방식으로 데이터를 주고 받을 필요가 있다. 이처럼 에서 HTTP 상으로 정보를 안전하게 주고 받을 수 있도록 통일한 규약을 OAuth 프로토콜이라고 한다. 1. 구성요소 4가지 아..

Java 한글 인코딩 안될때 jdk 버전 확인해야함. [내부링크]

배경 IDE 에서는 한글이 잘 출력되는데, java 소스코드(System.out.println)를 통해서 출력시 글자가 깨지는 현상. 원인 JEP-400(인코딩이 default 로 UTF-8 로 설정되는 기능)이 jdk 18 버전에서 문제를 일으키는 것으로 확인. (Windows 환경) 해결방안 jdk 버전을 17 이하 버전을 사용할 것. 참고 https://inside.java/2021/10/04/the-default-charset-jep400/ Jep 400 and the default charset – Inside.java Have you ever wondered what is `default charset`? Here’s what the javadoc for Charset.defaultCharse..

Spring MSA 를 간단하게 구현해보자 (+ 최신 release, 모니터링, heapdump) [내부링크]

GitHub - Dong-Hyeon-Yu/spring-cloud-monitoring-example: Monitoring Spring MSA example (release train-2021.01) / gateway+discover Monitoring Spring MSA example (release train-2021.01) / gateway+discovery+config+feign / grafana+prometheus+docker / jvm heap dump example - GitHub - Dong-Hyeon-Yu/spring-cloud-monitoring-example:... github.com 환경 ️ Release Trains : 2021.0.1 (https://spring.io/project..

프록시 요청 시 원래 사용자 ip 복원하기 (Nginx, Cloudflare) [내부링크]

[배경] 도메인 호스팅 업체 CloudFlare 를 사용 중. (이전에는 godaddy 를 사용하다가 호스팅이 불안정 했을 때, 급하게 옮긴뒤로 CloudFlare 가 더 편해서 계속 사용 중임.) CloudFlare에서는 프록시 모드로 https 통신을 지원해준다. 이 프록시 모드를 사용하면 웹서버로의 요청 ip가 실제 사용자의 ip가 아닌, CloudFlare의 프록시 서버 ip 로 찍히게 된다. 현재 운영하고 있는 개발용 api는 개발 팀원들만 접속할 수 있도록 특정 ip 만 열어놓은 상태이다. godaddy의 인증서가 서브도메인에는 적용되지 않아서, lets encrypt의 무료인증서로 서브도메인에 tls 프로토콜을 적용한 상태였다. 하지만 이 무료 인증서의 치명적인 단점은 3개월마다 연장을 해주..

AWS 운영비 줄이기(ec2, savings plan, ebs, s3) [내부링크]

최근 (1)더 많은 저장공간의 필요성 + (2)환율 급등의 이유로 월간 aws 이용 금액이 50% 정도 상승하였음. 이에 따라 aws 이용 비용을 줄이고자 하는 방안을 제시함. 1) 요금 현황 사용중인 EC2 인스턴스 : t3.medium(seoul) 스토리지 : HDD 128 GB 고정ip 2) EC2 비용 절감 부분: savings plans 1년 약정 (1) 예상 월별 결제액 : 22.92$ (2) 월간 실질 절감 비용: 16.5$ EC2 instance : 38$ - 23$ = 15$ VAT : 15$ * 0.1 = 1.5$ ⇒ 약 16.5$(20,911원) 절감 예상 (2022.05.03 현재 환율 1267.38 원/달러) 3) 스토리지 비용 절감 부분 - S3 (1) 예상 월 지출 금액 : 3..

JavaThread 에 대해 깊게 이해해보자 (feat. Openjdk 커널 분석) [내부링크]

Thread에 대한 기초적인 os 지식은 이 글(쓰레드(Thread)와 동기화 문제)을 참고하기 바람 Thread는 user가 관리하느냐, os가 관리하느냐에 따라 User-Level-Thread 또는 Kernel-Level-Thread 로 나뉜다. 두 가지의 장점을 합친 Hybrid 모델도 존재한다. Java에서는 Kernel thread와 User thread를 모두 사용하는 Hybrid 모델이다. (jdk 1.2 버전까지는 100% User-Level-Thread인 GreenThread라는 것이 있었다고 한다.) 그림을 잘 보면, User-level thread 3개가 2개의 Kernel-Level-Thread를 공유하고 있는 것을 알 수 있다. OS 수업을 듣다가, java 는 구체적으로 이런 방..

군생활 중 공정근무프로그램 만들었던 이야기.. [내부링크]

1. 부대 근무 환경 군생활을 기동대대에서 했다. 사단 직할 기동이라 불침번을 제외하고서는 근무가 없어야하는데,, 출동 시간을 줄이기 위해, 사단본부가 아닌 연대 본부에 위치해 있었던 관계로 이런저런 근무를 짬맞기 일쑤였다. 순찰 근무, 탄약고 경비 근무, 1년에 한번 예비군 훈련까지.. 부대의 환경이 자주 바뀌다보니 근무 형태도 자주 변경되었다. 더군다나 일일이 중대 행보관이 수기로 근무표를 작성하다 보니 누구는 근무를 많이 서는 일이 생기거나, 연달아 계속 들어가는 일도 생기기도 했다. 2. 중대 행정 업무 프로그램 제작기 많은 행정 작업이 한셀로 이루어지고 있었는데, 엑셀 VBA 코드를 사용할 수 있다. 그 때 당시 간단한 문서작업들을 자동화하면서 이곳저곳에 도움을 주고 다녔다. 그래서 VBA로 자..

[전공생이 설명하는 OS] 멀티 코어 프로세스 스케줄링 [내부링크]

이전 글 참고 단일 프로세스 스케줄링 & 시뮬레이션 결과 분석 1. Scheduling 분류 3가지 (1) Long-term schedule - job scheduler 라고도 한다. - 제출된 프로그램 실행 요청 중에서 어떤 것을 프로세스로 실행시킬 지 결정하는 스케줄링이다. - 사용자가 OS에 프로그램 실행. letsmakemyselfprogrammer.tistory.com 1. 고려해볼 만한 요소들 단일 코어에서는 언제, 어떤 프로세스를 실행시킬지만 결정하면 되는 문제였다. 하지만 멀티코어 환경에서는 고려해야 할 요소들이 꽤나 복잡하다. ready queue 를 어떻게 운영할 것인가? 한개의 global 큐만 사용할 것인가? 코어 당 한개씩 큐를 사용할 것인가? Cache affinity 를 어떻게..

[전공생이 설명하는 OS] 쓰레드(Thread)와 동기화 문제 [내부링크]

1. 쓰레드의 의미 프로세스의 의미를 두가지 측면에서 설명할 수 있다. (자원 관점) 자원 소유자로서의 최소 단위 (제어 관점) schedule 의 최소 단위 / 실행의 단위 보통 개발할 때 하나의 실행 흐름(single execution sequence)만 생각하기 쉽다.. 하지만 실제로 프로세스에는 실타래와 같이 여러개의 실행흐름(multiple execution sequence)이 존재할 수 있다. 이 때 실행의 단위(the unit of execution sequence)를 thread 라고 정의한다. 따라서 현대 os에서 multithreading은 단일 프로세스 내에서 여러개의 실행 흐름을 지원할 수 있는 능력을 의미한다. 가장 중요한 점은 다수의 thread는 같은 프로세스 내의 자원을 공유..

[전공생이 설명하는 OS] 프로세스 스케줄링(feat. 알고리즘 장단점 비교) [내부링크]

1. Scheduling 분류 3가지 (1) Long-term schedule - job scheduler 라고도 한다. - 제출된 프로그램 실행 요청 중에서 어떤 것을 프로세스로 실행시킬 지 결정하는 스케줄링이다. - 사용자가 OS에 프로그램 실행 요청을 제출 -> `요청 대기큐` - OS는 `요청 대기큐` 중 어떤 프로그램을 `ready state 큐`로 admit 할지 결정해야한다. - admit 되어서 실행가능한 대기 상태가 되면, 프로그램에 대한 PCB가 만들어져 프로세스가 된다. (2) Mid-term schedule - swapper 라고도 하며, 보통 swap function 을 가리키는 말. - multiprogramming 의 정도를 결정하는 요인이 된다. - swap out, swap..

[전공생이 설명하는 OS] 프로세스(Process)란? [내부링크]

1. Program vs Process - program : 디스크에 byte sequence로 저장되어 있는 passive entity - process : 메모리에 execution sequence 로 load 되어 있는 active entity 2. Process Description `프로세스` 를 설명할 때는 크게 3가지의 맥락을 고려한다. (1) 시스템 수준에서 os 가 프로세스를 관리하기 위한 정보 (2) User Program level 에서의 정보 (text code, data, stack, ...) (3) 프로세스를 실행하는 하드웨어의 수준의 정보 (1) System Level OS의 관리 대상이라는 점에서 프로세스를 바라본다. OS 는 프로세스 전체 목록을 가지고 있다. 이를 proc..

[전공생이 설명하는 OS] 쉽게 읽는 OS의 발전 이야기 [내부링크]

1. OS 의 목적 OS는 자원관리자로서의 성경이 강하다. 주로 기기 사용자가 안전하고 효율적으로 하드웨어를 사용할 수 있도록 돕는다. OS 의 목적은 크게 3가지로 나타낼 수 있다. 편의성. 컴퓨터 사용자가 하드웨어를 조작하기 위한 instruction 이나 구현방법 등을 알지 못해도 안전하게 사용할 수 있게 한다. 효율성. 사용자 경험을 최대화하기 위해 cpu utilization, cache memory, scheduling 등 자원을 관리 한다. 유연함. OS 가 개선될 때, 기존 User Application 에 영향을 주지 않으면서 발전할 수 있도록 한다. 2. OS의 발전 William Stalling 교재에서는 OS 의 발전을 크게 4단계로 구분한다. 1) Serial Processing ..

[JVM] 레퍼런스 [내부링크]

GC 관련 HotSpot Virtual Machine Garbage Collection Tuning Guide One strength of the Java SE platform is that it shields the developer from the complexity of memory allocation and garbage collection. docs.oracle.com JVM specification The Java Virtual Machine Specification Tim Lindholm Frank Yellin Gilad Bracha Alex Buckley Daniel Smith docs.oracle.com Java concurrency 정리 잘된 블로그 https://jenkov.com/..

[Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (2) Spring MVC 와 Spring Security [내부링크]

CORS 정책을 모른다면 아래 글을 먼저 읽으시길 바랍니다. [Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (1) w3c recommendation 파악 [Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (1) w3c recommendation 파악 https://fetch.spec.whatwg.org/ Fetch Standard fetch.spec.whatwg.org 프론트 단에서의 비동기 통신 요청 - XMLHttpRequest 객체를 이용한 AJAX(Asynchronous JavaScript And XML (en-US)) 프로그래밍을 용.. letsmakemyselfprogrammer.tistory.com [2가지 설정 방법] CORS 정책 설정은 Spring M..

[Python 뜯어보기] 5. 파이썬 가상머신(PVM) 과 컴파일방식 [내부링크]

java bytecode 찾아보다가 파이썬도 바이트코드를 확인할 수 있다는 것을 우연히 발견하게 되었다. 아니 그렇다는 것은,, 자바와 마찬가지로 파이썬도 컴파일 된 후에 인터프리터를 하는 하이브리드 방식이라는 얘기인가?!?! 하고 찾아봤다. python VM 이 코드를 interpret 하는 과정 https://caiocozza-art.medium.com/a-quick-overview-of-the-python-virtual-machine-pt-1-315e74c036f4 A quick overview of the Python Virtual Machine — Pt. 1 This is the part one of a series covering aspects of Virtual Machines and how..

JIT compiler [내부링크]

JVM 은 이식성을 위해 java specific instruction 을 생성하고 JVM 에서 line by line 으로 해석한다. 하지만 이런 방식은 c 같은 언어에 비해 매우 느릴 수 밖에 없다. c 는 모든 코드를 기계어로 한번에 번역하여 실행하는 반면 java 는 동일한 함수가 여러번 호출되는 경우에, 해당 함수를 번역하고 실행하는 작업이 반복되기 때문이다. 그러한 코드를 hot code 라고 하고, 잘 호출되지 않는 코드를 cold 코드라고 한다. 그래서 JIT 컴파일러를 도입하여, hot code 는 machine specific 한 기계어로 번역을 하고 캐시하는 것이다. 이런 방식으로 인터프리터 방식의 단점을 보완한다.

Java Bytecode 와 RISC-V instruction 비교 [내부링크]

c 와 java 의 차이점 - 함수호출을 c 에서는 call procedure, java 에서는 invoke method - 객체참조를 c 에서는 포인터, java 에서는 object reference - c 에서는 메모리를 동적할당한 후에 명시적으로 해제해야하는 반면, java 에서는 사용자가 그렇지 않았을 때의 오류를 방지하기 위해 garbage collector가 참조되지 않는 힙 메모리를 정리한다. (full gc 등) 그래서 java 에서는 free 라는 예약어가 없다. - c array 은 bound 검사를 하지 않는다. java 는 배열 선언 시 해당 배열에 대한 길이를 따로 저장하고, 범위를 초과하는 참조에 대해서 runtime 에 오류를 발생시킨다. Java Bytecodes vs RIS..

[Java의 정석] 12. 제네릭스, 열거형, 어노테이션 [내부링크]

1. Generics 1.1 제네릭스란? : 컴파일 시에 타입을 확인하는 기능. => 타입 안정성을 높이고 형변환의 번거로움을 줄인다. 1.2 제네릭 클래스의 선언 class Box { T item; void setItem(T item) { this.item = item; } T getItem() { return this.item; } } Box b = new Box(); b.setItem(new Object()); // error b.setItem("abc"); // ok // 이전 코드 호환을 위해 아래도 가능 Box b = new Box(); b.setItem(new Object()); // ok, but warning b.setItem("abc"); // ok, but warning Box : 제..

[서버 장애 (2022-04-01 23:47)] mysql 서버가 죽었다... [내부링크]

[발견시각] 23:47 [상황분석] 17:54 분에 파일 업로드를 동반한 게시글을 업로드함과 동시에 sql 서버가 다운됐다. django 서버는 500 에러 안내 페이지를 뿜뿜 잘 내고 있는것으로 보아,, 어이없지만 아마 sql 서버 용량이 100퍼센트를 초과해서 발생한 것으로 보였다. 당장 서버 접속해서 용량 확인했더니,, usage 100%.... mysql 은 죽어있었다. [대처] 기존의 aws EBS 볼륨을 스냅샷으로 복구 aws EBS 볼륨 크기 확장 ubuntu 에서 해당 확장된 파티션 적용 했더니만 tmp 폴더가 초기화가 되어버렸다. 그래도 무중단으로 해결해보려고 했는데,,, ㅜㅜ 장고서버 소켓 파일을 tmp 폴더에 뒀었는데 사라져버려서 nginx 가 502 에러를 대신 뿜뿜해주었다.... ..

[교육자료] 0. 신입팀원 Java 교육 커리큘럼 [내부링크]

1. 교재 자바의 정석 Java How To Program 10th, Deitel, Pearson 2. 커리큘럼 - 1주차 : 반복문, 제어문, 입출력 (~4장) 3.22 ~ 3.28 [과제] - 2주차 : 배열 (5장) 3.29 ~ 4.4 [과제] - 3주차 : 클래스 (설계를 다 주고 구현) (6장) 4.5 ~ 4.11 [과제] - 4주차 : 클래스 (설계 포함) (6장) 4.26 ~ 5.2 - 5주차 : 상속 (7장) 5.3 ~ 5.9 - 6주차 : 인터페이스와 다형성 (7장) 5.10 ~ 5.16 [과제] - 7주차 : GUI 시작, exception (8장) 5.17 ~ 5.23 [과제] - 8주차 : 날짜 및 기타 포매팅 GUI 에 녹여내기 (9장, 10장) 6.7 ~ 6.13 [과제] - 9..

[Java의 정석] 11. Collections Framework [내부링크]

1.5 Iterator, ListIterator, Enumerator : JCF 에서는 저장된 요소를 읽어오는 방법을 표준화하였다. Iterator 인터페이스에 정의되었고, Collection 인터페이스에 Iterator 를 반환하는 iteratore() 를 정의하고 있다 List list = new ArrayList(); // 다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다. Iterator it = list.iterator(); while(it.hasNext()) { // do sth.. } Map 인터페이스에는 iterator 를 반환하도록 되어있지 않기 때문에, key 나 entry 집합으로 반환한 후에 iterator 호출이 가능하다. Iterator keyIt = map.keySet().i..

[도메인 주도 설계 철저 입문] 12. 도메인의 규칙을 지키는 [내부링크]

어그리게이트란? 여러 객체가 모여 한가지 의미를 갖는 하나의 객체가 될 때, 이를 어그리게이트라고 할 수 있다. 어그리게이트는 경계와 루트를 갖는다. 루트는 어그리게이트 내의 특정한 객체인데, 외부에서 어그리게이트를 다루는 모든 조작은 루트를 거쳐야만 한다. 어그리게이트에 포함되는 객체를 외부에 노출하지 않음으로써 객체를 안전하게 다룰 수 있다. 객체를 다루는 기본 원칙 질서 없이 어그리게이트 내의 객체들을 다루게 되면, 객체의 논리적 일관성을 유지하기가 어렵다. UserName userName = new UserName("gildong"); user.name = userName; // 바람직하지 않은 변경 시도 user.changeName(userName); // ok 위와 같이 사용자의 이름을 변경 ..

[도메인 주도 설계 철저 입문] 10. 데이터의 무결성 유지하기 [내부링크]

무결성이란 : 정보가 서로 모순이 없고 일관적이라는 뜻. 무결성 위배되는 경우 : 사용자 중복 검사를 시행할 때, 사용자 A 가 회원 등록 시도 => 중복 검사 => 중복되지 않음! (사용자 A 의 회원 등록이 db 에 적용되기 전) 사용자 B 가 동일한 회원 등록 시도 => 중복검사 => 중복 안됨! 사용자 A 의 회원 정보 저장 사용자 B 가 A와 동일한 회원 정보 저장 데이터 무결성을 지키는 방법 1. 유일 키 제약 : 가장 강력한 수단이지만, 코드 상으로 드러나지 않고 비지니스 코드가 db 에 의존적이라는 단점이 존재. 트랜젝션과 함께 사용하는 것이 좋다. 2. 트랜젝션 1. db 트랜젝션 객체 이용 : 아래 코드는 트랜잭션 코드를 통해 무결성을 확보한다. 하지만 이 경우에는 인프라 객체인 con..

[Python 뜯어보기] 4. WSGI 와 Python [내부링크]

1. WSGI 란? "웹 서버 게이트웨이 인터페이스"라는 의미로, WS 와 WAS 사이의 인터페이스를 제공한다. (1) WS 를 변경해야할 일이 있거나 추가해야 할 때, (2) 또는 반대로 다른종류의 WAS 를 추가해야하거나 변경해야할 때 등의 경우에 ws 와 was 사이의 추가적인 설정을 하지 않아도 손쉽게 갈아낄울 수 있도록 돕는듯하다. (추상화 수준이 높은 것을 의존한다는 제어의 역전 개념과 비슷한듯) (제어의 역전 개념은 이전 포스팅(https://letsmakemyselfprogrammer.tistory.com/63) 참고) 2. UWSGI - wsgi 의 수많은 종류 중 하나. (gunicorn, Bjoern, CherryPy 등). - 다양한 언어 지원 - unix 소켓을 지원 3. WSGI..

[Python 뜯어보기] 3. 파이썬 Thread 와 GIL [내부링크]

자료 출처: http://www.dabeaz.com/python/UnderstandingGIL.pdf 1. Thread Execution Model (with GIL) - 파이썬을 실행시키면 => 하나의 프로세스, 하나의 인터프리터 - 파이썬 쓰레드는 real system(os) thread 이다.(unix 계열 posix thread, window 계열 window thread.) 완전히 os 가 관리한다. - GIL(global interpreter lock): 한 프로세스에는 여러 스레드가 존재할 수 있는데, 한 스레드가 인터프리터를 사용할 때 다른 쓰레드는 인터프리터를 사용할 수 없다. (인터프리터를 사용한다는 말은 파이썬 코드를 해석->실행시킨다는 말) - 즉 한 스레드가 cpu bound jo..

[Django 웹프로젝트] 11. 인메모리 캐시 사용해도 될까? 심층분석 - (2) uwsgi 와 python [내부링크]

[Django 웹프로젝트] 11. 인메모리 캐시 사용해도 될까? 심층분석 을 위한 분석 게시글 2편입니다. uWSGI 에 의해 특정 웹 요청이 특정 pid 로 연결된다고 하면, 인메모리 캐시를 사용해도 되므로 웹 요청에 대한 load balancing 방식을 알아보기 위해 wsgi 를 알아보기로 했다. (아래에 정리했음) [Python 뜯어보기] 4. WSGI 와 Python 1. WSGI 란? "웹 서버 게이트웨이 인터페이스"라는 의미로, WS 와 WAS 사이의 인터페이스를 제공한다. (1) WS 를 변경해야할 일이 있거나 추가해야 할 때, (2) 또는 반대로 다른종류의 WAS 를 추가해야하 letsmakemyselfprogrammer.tistory.com

[Django 웹프로젝트] 11. 인메모리 캐시 사용해도 될까? 심층분석 - (1) 파이썬 스레드, GIL [내부링크]

[Django 웹프로젝트] 11. 인메모리 캐시 사용해도 될까? 심층분석 을 위한 분석 게시글 1편입니다. 아래의 카테고리에 정리했습니다. [Python 뜯어보기] 3. 파이썬 Thread 와 GIL [Python 뜯어보기] 3. 파이썬 Thread 와 GIL [파이썬 쓰레드와 GIL] 굉장히 좋아보이는 자료 출처: http://www.dabeaz.com/python/UnderstandingGIL.pdf - 파이썬을 실행시키면 => 하나의 프로세스, 하나의 인터프리터 - 파이썬 쓰레드는 real system(os).. letsmakemyselfprogrammer.tistory.com

[SpringBoot] 6. ManyToMany 를 [내부링크]

1. 배경 인가 시스템을 고민하면서, 수직적인 권한과 수평적인 권한을 분리했다. 수직적 권한 : (비회원->미승인회원->일반회원->회장단->회장->관리자) 수평적 권한 : 부서 (IT 부, 운영부, 총무, 홍보부 등) 수평적 권한을 처리하기 위해 Team 이라는 도메인을 추가하기로 했다. 지금 동아리 운영 상황을 보자면, 두 부서에서 동시에 활동하는 사람은 없지만 한 부서에서 다른 부서로 이동하는 경우, 중간에 임시로 동시 활동하는 경우 등이 있었고, 꼭 한 부서만 속해있으리라는 법은 없으니까. Member 와 Team 을 다대다 관계로 설정했다. 2. 다대다의 문제 jpa 에서 ManyToMany 관계를 지원하고 있어서, 해당 어노테이션을 사용해 풀어내면 정말 쉽다. 하지만 두 엔티티 사이의 관계가 그..

[Django 웹프로젝트] 11. 인메모리 캐시 사용해도 될까? 심층분석 [내부링크]

[Django 웹프로젝트] 10. 호환성을 고려한 소셜로그인 버그 수정 (2022-03-14~15) (문제상황) - 소셜로그인을 통해서만 로그인이 가능하도록 구현되어있다. - OAuth2 인증 후 제공받는 사용자의 이메일 정보와, 회원가입 시 기재한 프로필 정보를 매핑해서 보관하고 있었다. - (로 letsmakemyselfprogrammer.tistory.com 위 작업 중, 소셜 계정 추가 연동 부분에서 보안처리를 변경할 때 했던 고민을 찾아봤다. 1. 상황 [기존 방식] - 단방향 md5 로 사용자id 를 암호화하여 넘김. => 복호화를 할 수 없으니 모든 사용자를 순회하면서 일치하는 확인했어야했다. [수정 방식] - key 를 이용하여 signature 를 생성하고 id 를 제외한 signatur..

[Java의 정석] 09. java.lang 패키지 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 1.1 Object 클래스 hashCode() : 객체의 주소값을 이용해서 해시코드를 만들어 반환한다. str 클래스는 문자열 내용이 같으면 도일한 해시코드를 반환하도록 오버라이딩되어 있다 toString() : 클래스이름 + @해시코드 값이 기본으로 설정되어있다. clone() : 객체의 값을 복사한다.. 참조타입의 경우에는 주소값을 복사하므로, 얕은복사문제가 있다. Cloneable 인터페이스를 상속받아 오버라이딩해야한다. 1.2 String 클래스 생성자를 이용한 경우에는 항상 새로운 String 인스턴스가 생성된다. 리터럴은 클래스가 메모리에 로드될 때 미리 생성되어있다. 따라서 같은 리터럴로 초기화되는 변수들은 모두 같은 주소의 문자열 리터럴을 갖는다..

[Java의 정석] 08. 예외 처리 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 1.1 프로그램 오류 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 1.2 예외 클래스 : Exception 은 checked Exception 과 unchecked Exception 으로 나뉜다. unchecked Exception 은 보통 프로그래머의 실수에 의해 발생하고, checked Exception 은 어플리케이션 외적인 요인으로 발생한다. 1.3 메서드에 예외 선언하기 main 에서도 예외가 처리되지 않으면, 프로그램이 종료된다. 1.9 자동 자원 반환 try with resources 문 try (FileInputStream fis =..

[Django 웹프로젝트] 10. 호환성을 고려한 소셜로그인 버그 수정 (2022-03-14~15) [내부링크]

(문제상황) - 소셜로그인을 통해서만 로그인이 가능하도록 구현되어있다. - OAuth2 인증 후 제공받는 사용자의 이메일 정보와, 회원가입 시 기재한 프로필 정보를 매핑해서 보관하고 있었다. - (로그인 과정) OAuth2 로그인 시도 => 이메일 받아서 db 에 프로필 정보와 매핑되어 있는지 확인 => 로그인 처리 - 네이버는 OAuth2 를 통해 제공하는 이메일이 달라질 수 있다. => 연락처이메일이 달라져서 로그인이 안되는 경우 발생 - 또 처음부터 정보제공 동의를 하지 않더라도, 로그인이 진행되어 필수로 받아야하는 이메일 값이 넘어오지 않는 경우 발생 - 이슈 : https://github.com/InhaBas/Inhabas.com/issues/102 (해결방안) provider 와 uid 값으로..

[Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언 [내부링크]

책에서는 예외 부분을 굉장히 간단하게 설명이 되어있는 것 같아, 더 구체적인 자료를 찾아봄 "예외는 조상 클래스이 메서드보다 많이 선언할 수 없다." 라고 적혀있지만, 엄밀히 말하면 checked Exception 에만 해당하는 내용이다. unchecked Exception 에 대해서는 자식 클래스에서 추가로 선언해도 상관없다. (case 1) 부모 메서드가 checked exception 던질 때, class Parent{ void method1() throws SQLException { //checked exception } } class Child extends Parent{ void method1() { } } (case 2) 부모 메서드가 unchecked exception 던질 때, class..

[Java의 정석] 07. 클래스 상속 & 인터페이스 상속 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 2.2 오버라이딩의 조건 조상 클래스이 메서드를 자손 클래스에서 오버라이딩 할 때, 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 예외는 조상 클래스이 메서드보다 많이 선언할 수 없다. 인스턴스메서드를 static 메서드로 또는 그 반대로 변경할 수 없다. 책에서는 예외 부분을 굉장히 간단하게 설명하는 것 같아, 따로 더 정리했다. [Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언 책에서는 예외 부분을 굉장히 간단하게 설명이 되어있는 것 같아, 더 구체적인 자료를 찾아봄 "예외는 조상 클래스이 메서드보다 많이 선언할 수 없다." 라고 적혀있지만, 엄밀히 말하면 checked letsmakemyselfprogrammer.tisto..

[Django 웹 프로젝트] 트래픽 및 방문자 수 (2022.02.11 ~ 2022.03.12) [내부링크]

- 트래픽 한달간 총 9 만건의 요청 일 평균 3천건의 트래픽 점점 증가추세, 학교 내에서 입소문을 타기 시작한듯. 신입부원이 계속 늘어나고 있다. - 고유 방문자 수 한달 간 총 고유 방문자 1670명 30일 동안의 일일 고유 방문자 수는 총 2918 명 (77, 117,53,68,90,99,89,75,92,89,75,115,98,100,137,129,72,80,81,92,138,113,154,83,67,87,148,93,109,98) 하루 평균 고유 방문자 수는 약 97명 - 하루 평균 방문자 한명이 요청하는 평균 트래픽 건 수 = (하루 평균 트래픽) / (하루 평균 고유 방문자) = 약 3000 / 약 97 = 약 31 건 평균적으로 머무르는 시간은 5분이 채 안되는 것으로 추정되는 트래픽 숫자...

[Django 웹 프로젝트] 9. 소셜 로그인 관련 오류 수정 (2022-03-13) [내부링크]

[문제 상황1] (선조치 후분석) : 회원 A가 소셜로그인을 통해 회원가입을 진행했는데, 이메일만 None 으로 받아졌던 상황.(재현 실패) 입부 완료 메일을 보내지 못해서 서버 오류 로그가 나고 있었다. (대처) : 일단 빠르게 조치하기 위해 해당 회원의 이메일 값을 받아서 db 에 직접 넣어줬다. (분석) : 소셜로그인을 통해 받은 이메일 정보는 회원가입 중에 임의 수정할 수 없도록 설정해두었다. 그래서 회원 정보를 저장하는 중에 오류가 난 것으로는 보이지 않는다. 정보동의를 하지 않거나 이메일이 넘어오지 않으면 아예 회원가입을 할 수 없도록 해놨었기 때문에, 이메일이 없이 회원가입 페이지로 넘어가는 것도 이해가 잘 되지 않았다. - https://developers.naver.com/forum/po..

[Django 웹 프로젝트] 8. 점진적으로 api 로 교체 가능? (2021-11-21) [내부링크]

rest api 로의 전환 필요성 기존 Django 는 rest api 가 아니라, html 까지 렌더링하는 방식이다. 하지만 이 프로젝트는 크게 2가지의 문제상황을 마주하고 있다. 첫째로는 유지보수가 과연 가능할까? 라는 의문이다. 이전의 블로그 포스팅에서 정리되어있다. [Django 웹 프로젝트] 6. 유지 보수를 위한 새로운 아키텍처 고민 (2021-10-21) [Django 웹 프로젝트] 7. 유지 보수를 위한 새로운 인가인증 체계 고민 (2021-10-31) 두번째로 어플 제작을 기획 중에 있다는 점이다. 어플을 만들기 위해서는 hybrid app / web app / native 앱을 만들어야한다. 네이티브 앱 : SDK기반으로 개발된 애플리케이션. 모바일 플랫폼 API를 이용해 개발한다. 모..

[도메인 주도 설계 철저 입문] 7. 의존 관계 제어 [내부링크]

1) 의존이란 무엇인가? (1) ObjectA 가 ObjectB 에 의존하는 관계의 예 public class ObjectA { private ObjectB objectb; } ObjectA 는 ObjectB 를 참조한다. 다시말해 ObjectB 가 없으면 ObjectA 는 정의될 수 없다. 이 때 ObjectA 가 ObjectB 에 의존한다고 한다. (2) 구현체가 인터페이스에 의존하는 관계의 예 public interface UserRepository { User find(UserId id); } public class UserRepositoryImpl implements UserRepository { @Override public User find(UserId Id) { (...생략...) } } ..

[Real MySQL 8.0] 4.1 MySQL 엔진 아키텍처 [내부링크]

4-1) MySQL 엔진 아키텍처.md GitHub Gist: instantly share code, notes, and snippets. gist.github.com

[도메인 주도 설계 철저 입문] 6. 어플리케이션 서비스 - 도메인 서비스와의 분리! [내부링크]

이 글을 읽고 깨달아,, 적용한 커밋. 아래 PR 중에 있다. [refactor/member] 회원 서비스 리팩토링 by Dong-Hyeon-Yu · Pull Request #94 · InhaBas/Inhabas.com-api 학년 정보 없애기 학기 -> 기수 중복검사로직을 도메인 영역으로 분리 (링크) 회원가입 서비스 리팩토링 회원종류 생성 #93 회원가입 가능 기간 및 인터뷰 기간 db 설정 기능 추가 팀 생성 #77 resolve github.com 이 책에서 말하는 서비스는 크게 두가지로 나뉘는 듯 하다. 하나는 도메인 서비스, 다른 하나는 어플리케이션 서비스. 도메인의 특성에 관한 활동은 도메인 서비스. 클라이언트에게 제공할 UseCase 에 대한 활동은 어플리케이션 서비스. 기존에는 layer..

[Spring boot] 5. 멀티모듈? MSA? 좋은 아키텍쳐가 뭐야?! [내부링크]

프로젝트 구조 변경을 고민하게 된 배경이 몇가지 있다. (1) layer 는 구분이 가지만, 파일이 많아져서 해당 layer 안의 특정 도메인을 한눈에 찾기가 어려워지고 있다. 또 그렇다보니 어떤 도메인 모델이 어떤 service 와 controller 로 이어지는지 알기도 힘들어질 것 같았다. 특히 새로운 개발자가 들어왔을때는 확실히 눈에 안보일 거 같았다. (2) 또 파일 업로드 및 다운로드를 동료 개발자가 맡아서 처리하고 있는데, 해당 기능은 완전히 독립적인 서비스로 빠져도 될 것 같다는 생각이 들었다. (원격 서버에 실제 파일을 업로드하고 다운로드 하게 해주는 파일 서버). 같은 모듈 내에 있는 것보다는, 적어도 다른 모듈로 독립적으로 구성할 필요가 있다. (3) 빅데이터 및 ML 동아리이기 때문..

[Java의 정석] 06. 객체지향 프로그래밍 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 4.5 가변인자(varargs)와 오버로딩 기존에는 메서드의 매개변수 개수가 고정적이었으나, JDK1.5 부터 동적으로 지정해 줄 수 있게 되었다. '타입... 변수명' 과 같은 형식응로 선언. 매개변수 중에서 가장 마지막에 선언해야 한다. (컴파일러의 매개변수 매핑 로직인듯하다.) 인자가 아예 할당되지 않을 수도 있고, 배열이 포함될 수도 있다. public PrintStream(String format, Object... args); 여러개의 문자열을 타입으로 받는 메서드를 생각해보자. 아래와 같이 두가지 버전으로 작성할 수 있다. //1st String concatenate(String... str) {...} //2nd String concatenate..

[도메인 주도 설계 철저 입문] 5. 레파지토리 - 데이터와 관계된 처리를 분리하자 [내부링크]

프로그램을 실행할 때, 메모리에 로드된 데이터는 프로그램을 종료하면 그대로 사라져버린다. 특히 엔티티는 생애주기를 갖는 개체이기 때문에 프로그램의 종료와 함께 사라지면 안된다. 이를 위해서는 데이터를 데이터스토어에 저장하고 불러올 수 있어야한다. 데이터스토어로부터 불러오고, 저장하는 등의 행위를 추상화한 객체가 레파지토리 객체이다. 레파지토리의 역할과 책임 이 레파지토리 객체는 도메인 개념으로부터 유래한 것이 아니라, 기술적 문제를 해결하기 위해 탄생한 객체이다. 따라서 도메인을 잘 서술한 코드를 헤집어놓지 않으면서, 기술적 코드를 잘 분리해는 역할을 담당한다고 볼 수 있다. 특히 특정 db 에 의존적일 수 밖에 없는데, 이 때문에 더 다루기 까다롭게 되는 코드가 되어버릴 때가 많다. 그래서 레파지토리 ..

[도메인 주도 설계 철저 입문] 4. 도메인 서비스 - 부자연스러운 도메인 객체의 행동을 맡기자 [내부링크]

값 객체나, 엔티티 같은 도메인 객체에는 객체의 행동읠 정의할 수 있다. 예를 들어 사용장명으로 사욯라 수 잇는 문자열의 길이나 문자의 종류에 제한이 있다며 ㄴㅇ이런한 지식은 사용자명을 나타내는 값 객체에 정의할 수 있다. 근데 시스템에는 도메인 객체로 구현하기 어색한 행동도 있다. 도메인 서비스는 이런 어색함을 해결해주는 객체다. 예를 들어 사용자 이름 중복 여부 기능을 추가한다고 하자. 이 코드를 User 라는 도메인 객체에 추가하게 된다면 아래와 같이 할 수 있다. class User { private UserId id; private UserName name; public User(Integer id, String name) { if (Objects.isNull(id) || Objects.isNu..

[도메인 주도 설계 철저 입문] 3. 엔티티 - 생애주기를 갖는 객체 [내부링크]

도메인 주도 개발에서 말하는 엔티티는 도메인 모델을 구현한 도메인 객체를 의미한다. 이전 장에서 다뤘던 값 객체도 도메인 객체를 의미한다. 값 객체와 엔티티의 차이점 값 객체와 엔티티의 차이점은 "동일성"을 식별할 수 있는지에 달려있다. 예를 들어 값 객체는 이름, 학년 등의 특정 성질을 띄는 값을 캡슐화한 것이라면, 엔티티는 회원을 예로 들 수 있다. 값 객체는 변하지 않는 값이고 (수정이 아닌 새로 생성, premitive type 을 예로 들면 쉬울 듯) 엔티티는 수정 가능하다. 또 속성이 같아도 다른 엔티티일 수 있는데 예로 같은 이름값이어도 다른 사람일 수 있는 것처럼 말이다. 따라서 엔티티를 식별할 수 있는 고유필드가 필요한데, 사람의 경우는 주민등록번호 등이 될 수 있다. 개발을 할 때, 이..

[도메인 주도 설계 철저 입문] 1. 도메인 주도 설계 읽게 된 이유 [내부링크]

www.inhabas.com rest 개편 작업 중, 파일 업로드 및 다운로드에 관한 모듈을 따로 생성해야할 필요가 느껴졌다. 그러면서 프로젝트 구조에 관한 고민을 하게 됐다. (아래 글 참고) [Spring boot] 6. 멀티모듈? MSA? 좋은 아키텍쳐? 도대체 뭐야?! 프로젝트 구조 변경을 고민하게 된 배경이 몇가지 있다. (1) layer 는 구분이 가지만, 파일이 많아져서 해당 layer 안의 특정 도메인을 한눈에 찾기가 어려워지고 있다. 또 그렇다보니 어떤 도메인 letsmakemyselfprogrammer.tistory.com 기존에는 모노리식으로 작업하고 있었다. 물론 최대한 영역을 나누어, 의미상 모듈처럼 분리될 수 있도록 "최대한" 의존성을 나누며 작업하고 있었다. 프로젝트 폴더 ..

[도메인 주도 설계 철저 입문] 2. [내부링크]

흔히 프로그램을 작성하다보면, 사용자의 이름이나 나이 등을 원시타입(String, int) 등에 그대로 저장하는 경우가 있는데, 이런 경우에는 해당 값의 특성을 제대로 나타낼 수 없다. 이것은 여러 개발자가 함께 작업할 때 그 단점이 명확하게 나타나는데, 만약 String name 이라고 했을 때, 이름 값이 성과 이름을 포함하는 이름인지, 한국인 이름만 포함하는 이름인지 알 수 없기 때문에, db 를 조회해서 기존 data 가 어떤 식으로 저장되어 있는지 조회해야하는 등의 불편함이 있다. 따라서 원시타입을 그대로 사용하는 것이 아니라 해당 특성 값을 잘 나타낼 수 있도록 하면서, 동시에 유효성 검사도 진행할 수 있는 "값 객체"를 활용하는 것이 좋다. 값 객체를 도입했을 때의 장점 표현이 분명해진다. ..

[Java의 정석] 05. 배열 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 1.2 배열의 선언과 생성 byte, short, int, long 타입 배열 : 0으로 초기화 char 타입 배열 : null('/u0000')로 초기화 float, double 타입 배열 : 0.0 으로 초기화 boolean : false 로 초기화 참조 타입 배열 : null 로 초기화 1.3 배열의 길이와 인덱스 - 배열은 한번 생성하면 길이를 변경할 수 없다. - 배열의 길이는 JVM 이 별도로 갖고 있다. - (배열이름).length 로 값을 읽을 수 있다. (상수이기 때문에 변경은 불가능하다.) 1.4 배열의 출력 - 배열 이름을 그대로 println 하게 되면, '배열타입@배열주소' 와 같이 출력된다. - 하지만 char[] 배열은 string ..

[Java의 정석] 04. 조건문 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 2.1 enhanced for statement for (타입_변수명 : 배열_또는_컬렉션) { // do something } - read only, jdk 1.5 부터 추가됨. 2.6 이름 붙은 반복문 Loop1 : for (int i = 2; i

[Java의 정석] 03. 연산자 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 1.4 연산자 우선순위 - instanceof 는 비교연산자 , = 와 우선순위가 동일하다. 1.5 일반 산술 변환 - 피연산자의 타입이 다르면, 더 큰 타입으로 자동 형변환된다. (overflow 방지) - 피연사자의 타입이 int 보다 작은 타입이면 int 로 변환된다. 3.1 사칙 연산자 - 상수 또는 리터럴 간의 연산은, 컴파일러가 최적화를 진행한다. char c1 = 'a' // char c2 = c1 + 1; // compile error! 명시적 형변환 필요! char c2 = 'a' + 1; // java complier 에 의해 'b'로 치환됨. 3.2 나머지 연산자 - 우항은 0이 될 수 없다. - 음수도 가능한데, 양수일 때와 절대값이 동일..

[Java의 정석] 02. 변수 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 1.1 변수란? : 단 하나의 값을 저장할 수 있는 메모리 공간. 1.2 변수의 선언과 초기화 : 변수를 선언하면, 메모리 빈 공간에 변수타입에 알맞은 크기의 저장공간이 확보되고, 이 공간은 변수이름을 통해 사용할 수 있게 된다. : 추가로 하나의 프로세스는 가상 메모리를 OS 의해 할당받는데, 하나의 java application 또한 가상 메모리를 할당 받는다. 할당받은 가상 메모리를 이용하여, JVM을 띄운다. JVM 은 특별한 설정을 하지 않으면 기본 350MB 정도의 힙 메모리 제한을 갖는다고 한다. 보통 로컬 변수를 생성할 때는 이 힙 메모리에 생성되고 GC 에 의해 관리된다. : 한번 JVM 이 할당한 물리메모리는 GC 가 JVM 내의 힙메모리에서..

[Java의 정석] 01. 자바란 [내부링크]

모르는 것만 짧고 빠르게 정리한 노트입니다. 자바란 현재는 오라클 사에 인수된 썬 마이크로시스템즈에 의해 개발된 객체지향 프로그래밍 언어이다. JVM 때문에 운영체제에 독립적인 이식성(portability)이 뛰어난 언어이다. 전통적인 컴파일러와 인터프리터의 성격을 모두 갖는 하이브리드 컴파일러의 특성을 갖고 있다. 소스코드는 javac(java compliler) 에 의해 bytecode 로 변환된 후 java(java interpreter) 에 의해 런타임으로 해석된다. 자바 언어의 특징 운영체제에 독립적이다. 객체지향 언어이다. 비교적 배우기 쉽다. Garbage Collection 으로 프로그래머가 메모리 관리에 신경을 덜 써도 된다. 네트워크와 분산처리를 지원한다. 멀티쓰레드를 지원한다. 동적 ..

[서버 장애 (2022-01-11 21:20)] 갑자기 다른 TLS 인증서가 적용됐다?! 홈페이지 차단당함 ㅠ [내부링크]

상황 : 07일 금요일 저녁, 홈페이지 도메인과 인증서 상의 도메인 불일치로 인해 브라우저에서 '신뢰할 수 없는 사이트'로 차단하는 현상 발생. : 인증서가 갑자기 *.inha.ac.kr 학교 인증서가 걸려버림. : 기존 서버는 학교 내부에 위치하고 있었음. 분석 IS 라우팅 오류로 교내 서브넷이 한꺼번에 묶였다? => CIDR 방식의 라우팅 테이블 특성 상 address aggregation 할 때 longest mask 가 우선하기 때문에, 해당 가정은 의미가 없다. => dns 라우팅 오류라기에는 *.inhabas.com 이 모두 잘 접속되었다. 다만 인증서만 기존 것이 아닌 학교 인증서가 걸렸다. nginx 까지는 접속이 잘 되는 상황. 로그를 확인해보니 ssl handshake connectio..

[서버 장애 (2021-09-13 12:22)] uwsgi --ini 과 linux effectiveUser 에 대한 문제 [내부링크]

상황 : 프로젝트 폴더를 옮긴 후 기존의 프로젝트 폴더를 삭제하자마자 발생 : 예산 내역과 명예의 전당 페이지 렌더링 중에 not found file or directory 오류 발생 해결 : 2021-09-13 13:15 : uwsgi 프로세스 ini 시, 기존의 작동하던 프로세스가 꼬여서 새로운 프로세스가 nginx와 연결되지 못함. 기존의 프로세스가 nginx 와 붙은 채로 떨어지지를 않음 : uwsgi 관련 모든 프로세스 강제 종료 후 올바른 권한의 계정으로 새롭게 ini 해주었음 분석 : uwsgi ini 시 프로세스의 effective user 권한이 설계와 다르게 움직이면서, 그에 따른 파일들의 권한도 꼬이게 됨.. 추가 방향 : 서버 권한 및 프로세스 effective user 권한을 분석..

[Django 웹 프로젝트] 7. 유지 보수를 위한 새로운 인가인증 체계 고민 (2021-10-31) [내부링크]

https://github.com/InhaBas/Inhabas.com/discussions/77 새로운 권한설계 고민 · Discussion #77 · InhaBas/Inhabas.com — 기존 권한 검사 문제점 — 유저마다 역할과 그룹이 있는데, 어떤 url 요청이 있을 때마다 해당 유저의 역할과 그룹을 확인하는 함수를 이용했다. 권한 관련 설정이 초기에 계획했던 것보다 더 github.com — 기존 권한 검사 문제점 — 유저마다 역할과 그룹이 있는데, 어떤 url 요청이 있을 때마다 해당 유저의 역할과 그룹을 확인하는 함수를 이용했다. 권한 관련 설정이 초기에 계획했던 것보다 더 복잡해지면서, if 문으로 추가되는 코드량이 점점 많아졌다. 현재는 유저 역할이나 그룹에 대한 변경이 필요할 시에, 거..

[Django 웹 프로젝트] 6. 유지 보수를 위한 새로운 아키텍처 고민 (2021-10-21) [내부링크]

— 현재 문제점(2021-10-21) — views, DB, 권한간 의존성이 커서 서로 종속적이다. 하나가 수정될 시에 다른 여러곳에 영향을 미칠텐데 그 영향을 최소화할 필요가 있다. (DB 와 views) spring의 dao, domain, dto 와 같은 형태 도입이 필요해보임 view 안에서 db 속성값을 기술하니, 가독성이 떨어짐 db 최적화 등의 이유로 추후 db 모델을 변경할 때, 모든 views 에서 일일히 변경해야함. 다 완벽하게 찾을 수 없음. 장고 ORM 쿼리를 views 에서 직접 날리는 것 안좋은 듯. (DB 와 forms) 현재는 클라이언트 사이드를 장고 템플릿 언어로 해결하고 있지만, 향후 vue로 분리될 것을 생각하면, forms 는 vaildation의 역할만 하게 됨. f..

[Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (1) w3c recommendation [내부링크]

공식 레퍼런스 https://fetch.spec.whatwg.org/ [프론트 단에서의 비동기 통신 요청] - XMLHttpRequest 객체를 이용한 AJAX(AsynchronousJavaScript And XML (en-US)) 프로그래밍을 용이하게 하기 위해 jquery-ajax/fetch/axios 를 사용함. [서버 단에서의 비동기 통신 응답] - api 엔드포인트에서 적절한 응답을 보내주면 되는데, 이 때 CORS 정책을 잘 지켜주어야 한다. 1. CORS(Cross Origin Resource Sharing)란? - Origin 이 다른 경우에 자원을 주고 받을 수 있도록 하는 http 통신 프로토콜. - Origin 은 https://naver.com, http://localhost:808..

[Django 웹 프로젝트] 5. static file name hashing 하기 (2021-09-09) [내부링크]

[배경] 당시에 프론트 단의 js validation 로직을 구현하고 서버에 적용을 시켰는데, 적용된 파일이 제대로 작동하지 않는 현상이 발생했다! 일일이 서버의 파일 수정 -> 빌드 -> 재배포 하면서 계속 디버깅해본 결과,, static file 이 브라우저에 의해 캐시되고 있어서 변경된 js 파일이 적용되지 않았던 것이다. 파일 이름은 동일하니까, 브라우저 입장에서는 해당 파일이 변경되었는지 알 수 없다. [가능한 대처 방안] 이 경우에는 사용자가 직접 쿠키를 지우거나, ctrl+f5 눌러서 새로 정적파일을 받아오거나 파일 이름에 해시값을 붙여, 배포 시에 변경된 파일 이름만 해시값을 변경해주는 방식 파일 이름에 태그를 붙이는 방식인데, naver 메인페이지 html 헤더 보니까, 태그에 수정날짜를..

[Django 웹 프로젝트] 4. 댓글(vue.js)을 django 에 붙이기 (2021-08-03) [내부링크]

[배경] 댓글도 django 에서 url 엔드포인트 잡고 작업했더니, 댓글을 CRUD 가 일어날 때마다 전체 화면 렌더링이 다시되었다. 팀원들 모두 그 때 당시에는 이게 불편하다고 느꼈는데, 아무도 해결할 수 있는 사람이 없어보여서, 내가 뚝딱 해버리자는 마인드로 시작했다. 왜냐하면 django 로 템플릿 렌더링까지 다 해야하는 상황에서, 프론트팀 3명은 웹 디자인만 해주고, 백엔트팀(선배 한명과 나)이 모든 기능을 개강전까지 다 마무리를 해야하는 시기였다. 백엔드 쪽에서는 웬만한 기능은 다 구현이 되었고, 자잘한 버그와 프론트쪽에서의 폼 유효성 검사 등을 추가해야했었다. 진짜 심적으로 엄청 급하게 했던 기억이 있다. 첫날에 검색하면서 좀 알아보다가 비동기 , Restful 등의 개념을 알게 되었고, 댓..

[Spring Boot] 3. OAuth2 인증 설계 및 구현 (feat. Security FilterChain 분석) [내부링크]

이 게시글은 당시에 고민했던 내용으로, securityFilterChain 을 파헤치기 아주 좋은 공부였습니다. 현재는 인증 모듈을 구현 완료하여, https://github.com/InhaBas/Inhabas.com-api/wiki/Auth-module-document 에 자세히 작성하여 놓았습니다. 아래의 사진과 같이 OAuth2 인증을 통해 로그인/회원가입이 가능하도록 되어있다. 이를 spring 에서 구현해야하기 때문에, spring security 및 oauth2 인증 관련하여 공부했다. [spring security 구조] 아래 깃헙 이슈에서 자세히 기술해놓았다. spring security 구조를 파헤쳐보자 · Issue #48 · InhaBas/Inhabas.com-api 슬슬 소셜로그인도..

[Spring Boot] 2. 서버 개발 환경 분리 (Spring Cloud Config 적용) 및 배포 자동화 [내부링크]

[배경] 기존의 장고 프로젝트를 배포서버와 개발서버로 나누어서 운영했음. ( 테스트 환경 설정파일 / 개발 서버 환경 설정파일 / 배포서버 환경 설정 파일 ) 모두 달랐다. 외부에 노출되면 안되는 정보들이 있어서 github 에 무턱대고 업로드 할 수가 없었다. => 로컬에서 직접 관리했다. 하나의 리눅스 서버 안에서, 유저를 나누어서 환경을 분리했다.. 프로젝트 하위에 rsync 로 직접 설정파일을 넣어주고 있었다. 빠르게 환경 설정 파일을 변경해야할 일들이 생겨서, 직접 리눅스 서버 파일을 수정했다가 나중에 내 로컬 원본을 수정했다 하면서, 설정파일 관리가 힘들어짐. 동아리 예산 문제, 학교 네트워크 문제 등으로 서버를 옮기거나 재시작해야하는 등 프로젝트를 새로운 환경에서 재빌딩하는일이 종종 있었는데..

[Spring Boot] 1. 게시판 테이블 재설계 [내부링크]

기존의 Django 레거시를 갈아 엎기로 하고나서, 처음으로 한 것은 게시판 테이블을 다시 설계한 것이다. www.inhabas.com 의 가장 핵심기능은 대부분 게시판이다. 기존의 레거시에서는 모든 게시판 종류마다 (게시판 테이블 + 댓글 테이블 + 파일 테이블) 이렇게 되어있었다. 자유게시판과 같이 새로운 게시판이 하나 더 늘어나면 게시판콤보세트(게시판 테이블 + 댓글 테이블 + 파일 테이블) 를 하나 만들고, 중복되는 비지니스 코드를 만들고, 권한검사에 추가하는 로직을 짰다. 근데 중복되는 비지니스 코드를 줄인다고, 엔티티매퍼를 따로 설정해서 게시글 타입 번호로 if else 엄청 쓰고, 그 중간에 권한 검사 if else 엄청 남발해서,,,,, 허허,,,, 그 개고생을 하면서 느낀것! 유지보수 불..

[Python 기초] 6. OOP 캡슐화&추상화 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의 : https://youtu.be/lG7R3PTz-Q4 과제 : https://docs.google.com/presentation/d/1da-LaELQZYoRl69zH_2mU5ln_3GzXV_HqBlBfKRx-N0/edit?usp=sharing 6차시 과제 Triangle class와 각 점을 나타낼 Point class 생성 [ figure.py main.py ] 총 2개의 파일 생성 Point class는 정수형 변수 x, y를 private 멤버 변수를 가지고, show_info 함수, x와 y를 set하고 get하는 멤버 함수를 갖는다 docs.google.com

[부록] 3. 가상환경을 주피터 커널에 연결하기 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의 : https://youtu.be/e-bmOWUe4cM

[부록] 2. 가상환경의 이해와 실습 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의 : https://youtu.be/5N6G2vEFoXY

[부록] 1. 파이썬 실행 원리와 주피터 노트북 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의 영상 : https://youtu.be/j9_MdAO8Rvg

[Python 기초] 5. 객체와 클래스, 근데 이제 namespace 를 곁들인 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 본 강의 영상에서는 주피터 노트북을 사용합니다. 주피터 노트북에 대한 설명과 사용 방법 영상은 (https://youtu.be/j9_MdAO8Rvg) 참고하시길 바랍니다! 강의 : https://youtu.be/e5FvSfmCWpE 과제 : https://docs.google.com/presentation/d/1tzSRtYtCvf7WsGB8Ad1NZXKvbrVkYn8ntWTHqt55x_Y/edit?usp=sharing 5차시 과제 Management class 와 Duck class 생성 [ management.py duck.py main.py ] 총 3개의 파일 생성 인경..

[Python 기초] 4. 깊은 복사 / Dict, Set, Tuple / Comprehension [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의안 : https://fragrant-comfort-49c.notion.site/4-dict-tuple-set-list-aed881faa0714b7494a8abff355d1340 강의 : https://youtu.be/0dArVgvTS_w - YouTube www.youtube.com 과제 : https://drive.google.com/file/d/1riY2F1M5jL5enWszRXj1R1s1c0vx3Two/view?usp=sharing 4차시 과제.zip drive.google.com

[Python 기초] 3. 함수와 네임스페이스 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의안 : https://fragrant-comfort-49c.notion.site/3-Scope-482a74afd8b24d1090d6df86b4fc4657 강의 : https://youtu.be/gRtpTDT3hhk - YouTube www.youtube.com 3차시 과제.pptx [과제 1] 팩토리얼 (ver. 재귀함수) [조건 1] 입력은 0

[Python 기초] 2. 리스트와 반복문 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의안 : https://fragrant-comfort-49c.notion.site/2-7185828112a044cd8478beb5aaa8e996 강의 : https://youtu.be/F64wjEJex6c 과제 : https://docs.google.com/presentation/d/1XV3VjOFMZ3OnLIyl8DcYMbLfQGU_P8ry/edit?usp=sharing&ouid=111629839257302804853&rtpof=true&sd=true 2차시 과제.pptx 과제 업로드시 유의사항!! 각각의 과제는 소스코드파일 .py 와 cmd 실행 결과를 스크린샷한 이미..

[Python 기초] 1. 입출력 / 변수 / 조건문 [내부링크]

해당 강의는 인하대학교 빅데이터 탐구 동아리 (www.inhabas.com) 에서 신입생을 대상으로한 파이썬 기초 강의 영상입니다. 강의안 : https://fragrant-comfort-49c.notion.site/1-d08477be793e439b8bda7eebe0d6d713 1차시 과제.pptx 과제 업로드시 유의사항!! 각각의 과제는 소스코드파일 .py 와 cmd 실행 결과를 스크린샷한 이미지 파일이 있어야 합니다. 각각의 과제 파일 이름은 ex1.py, ex2.py 등으로 저장해주세요! 이미지 파일 docs.google.com

[Django 웹 프로젝트] 3. 파일 관리 시스템 개선 (2021-04-30) [내부링크]

[배경] 게시판과 게시판에 대한 파일 테이블이 1:n 으로 매핑되어 있다. 근데 문제는 일반게시판 테이블 - 일반게시판 파일 테이블 공모전게시판 테이블 - 공모전게시판 파일 테이블 강의게시판 테이블 - 강의게시판 파일 테이블 이런 식으로 게시판 종류에 따라, 그에 해당하는 파일 테이블이 하나씩 붙어있는 구조였다. 그래서 ORM 상에서도 모든 게시글 도메인과 파일 도메인이 각각 따로 존재했고, 중복되는 코드도 너무 많았다. 예로, board 앱의 views.py 에서 normalBoard - normalBoardFile 에 대한 CRUD 와 유효성 검사 로직이 있으면, contest 의 views.py 에서도 contestBoard - contestBoardFile 에 대한 거의 유사한 로직이 반복되는 것..

[Django 웹 프로젝트] 2. 장고 폼(forms) 도입 => 코드 간결화 (2021-04-28) [내부링크]

[배경] 슬슬 진행하고 있던 웹 제작 프로젝트가 거의 끝나서 그 동안 작업했던 과정들을 남겨볼까 한다. 동아리에서 사용할 웹페이지를 제작 중이다. 동아리 내에서 서로 강의하고, 배우는 것을 중요하게 생각해서, 지금은 강의 관련 앱을 구현 중이다. 처음으로 맡았던 부분은 공모전 게시글 CRUD 부분이다. 공모전에 관심이 있는 사람이 게시글을 직접 작성하여 동아리 내에서 같이 참가할 팀원을 모집하는 방식이다. 이 프로젝트에 중간 합류하고 처음하는 작업이었기 때문에, 다른 백엔드 개발 맡으신 분이 어떻게 코드를 짜고 있었는지를 참고하면서 스타일을 최대한 맞추려고 했다. 그런데, 그 분의 코드를 보면서.. 중복되는 코드가 너무 많고, 가독성이 떨어진다고 느꼈다. 1. 중복되는 코드 함수화 예를 들어 게시판 내에..

Kaggle - [House Prices] 집값 예측 모델링 후기 [내부링크]

학교 동아리에서 데이터 분석, 머신러닝에 관심있는 사람들끼리 모여서 시작했다! 8주 정도에 걸쳐서 진행했다. 처음에는 한 달 동안은 네이버 부스트 코스를 통해서 파이썬을 이용한 기본적인 데이터 분석 방법들을 익혔다. 나는 심심해서 네이버 부스트 코스에 있던 모든 머신러닝 관련 수업을 들었던 상태였다. 그래서 팀원들에게 부스트 코스로 공부하자고 했다. 처음에는 이왕 프로젝트를 진행하는 김에 공모전에 도전해보자고 다들 얘기를 했었다. 그래서 전주시 빅데이터 공모전에, 세부 지역별 인구 피라미드 예측 모델을 설계하려고 했다. 주 2회 회의를 진행했다. 1번은 파이썬을 통해 라이브러리 등을 공부했던 내용을 공유하는 것이었고, 다른 회의에는 공부했던 내용을 기반으로 전주시에서 제공하는, 여러 기초 데이터들을 분석..

[Django 웹프로젝트] 1. 어쩌다 생애 첫 프로젝트 (2021-04-04) [내부링크]

어쩌다 시작하게 됐다. 설계단계부터 시작하는 건 아니고, 동아리를 새로 들어갔는데, 백엔드를 한명 뽑고 있어서 지원했다. 와서 보니 설계는 다 끝났고 이제 막 게시판 CRUD 정도 마친 상태였다. 나는 살면서 협업 프로젝트는 처음인지라 나중에 공부해야지~ 라며 Git, github도 모르던 상태고 데이터베이스도 쿼리문만 다룰 줄 아는 정도다. 근데 내 블로그 이전 글 '파이썬을 공부하게 된 이유'를 보면 알겠지만 대용량의 트렌젝션을 처리하는 백엔드를 개발해보고 싶다는 생각도 있었고, 혼자만 방에 틀어박혀서 공부하는 것이 내 발전에 그렇게 큰 영향을 미치고 있지도 않다는 생각이 들던 참이었다. 그래서 빈틈 투성이지만 열심히 공부할 각오로 지원해서 시작하게 되었다. 프로젝트 팀장 형이 생각보다 할 줄 아는게..

[삼성전자 X 관악구] 멘토링 후기 [내부링크]

3월 초, 전역한지 얼마되지 않았을 적에 발견했던 멘토링 프로그램이다. 관악구청 청년지원부(?)에서 삼성전자 현직자 한 분을 멘토로 잡아주셔서 한시간 가량 이야기를 나눌 수 있는 기회를 제공받았다. 그냥 신청하기만 하면 된다!! 그 당시에 신청해서 4/3(토) 11시~12시에 진행했다. 이 멘토링의 후기를 말하기 앞서서 내 개인적인 사정을 조금 설명하고 싶다. 올해 초에 전역을 했는데, 작년에, 그러니까 군복무 한창 하고있을때에 어머니가 암에 걸리셨다는 이야기를 전해들었다. 코로나 시국에 군인은 밖에 잘 나갈 수가 없다. (부대에 갇혀산다. 게다가 마스크 쓰고 훈련받는다...) 어찌저찌 무사전역하고 집에 왔다. 원래는 부모님께서 맞벌이를 하고 계셨는데, 엄마가 일을 못하니까,, 재정적으로 많이 힘들더라...

Multiple Linear Regression 정리 + 느낌 [내부링크]

"""최근 맨 땅에 헤딩하는 식으로 빅데이터를 혼자 공부했었는데, Feature Engineering 할 때, 왜 해당 피쳐를 선택해야하는지, 어떤 건 없애야하는지, 어떤 피처는 만들어서 사용해도 되는지 등에 대한 논리적 근거가 궁금했다. 다른 사람들이 수행한 EDA를 열심히 뜯어봐도 수학적 근거까지는 명시하지 않았기 때문이다. 대충 싸이킷런으로 예측과 분류의 정확도를 올리는 법을 익힌 후에, '아~ 그냥 이게 전부인가..?'라는 생각에 딥러닝에 도전했다,, 텐서플로우를 통해 잠시 공부하다가, 싸이킷런처럼 fit() 하고 결과가 나와버리는 것을 보고,,, 너무,,, 답답했다. 속 알맹이에 뭐가 들어있는지도 모르고 쓰는게 너무 찝찝해서, 모델들을 수학적으로 더 공부해야할 필요성을 느꼈다. 수학적인 부분들을..

EDA(Explosive Data Analysis) 흐름 정리 [내부링크]

최근 몇 일간 빅데이터 분석에 관해 공부를 시작했다. 혼자서 이곳저곳 기웃거리면서 여러가지 개념들을 접했다. 방대한 양의 지식들이 있었고, 전문성을 요하는 수준까지의 깊이도 필요했다. 따라서 먼저 크게 흐름을 잡아보는 것을 목표로 공부해보았다. EDA란 탐색적 정보 분석이다. 주어진 정보에 대한 보편적이고 절대적인 규칙, 성질, 논리 같은 것이 있을 수 없다고 가정한다. 따라서, 말 그대로, 특성이라고 할 만한 것들을 탐색해가는 행위를 말한다. 수학적 전제들과, 기법들이 많지만 이 글에서는 큰 흐름만을 정리해두고, 차후에 조금씩 분석해볼 예정이다. 파이썬에서는 데이터 분석을 위한 여러가지 좋은 패키지를 제공한다. 패키지 정리는 나중에 여건이 되면 하기로..! - numpy : 행렬 연산을 빠르게 처리하기..

[머신러닝을 위한 파이썬] 3. pandas 활용 예제 [내부링크]

>> 완벽하게 알아야 하는 자료구조 Series DataFrame >> 알아야하는 문법 파일 읽어오기, 저장하기 Series 생성방법 DataFrame 생성방법 DataFrame Col : 추가, 삭제, 이름변경, 새로운 데이터 할당, 선택적 불러오기 loc / iloc Index 변경 (KEY 값 변경) Data drop Operation, BroadCasting inplace, map, apply decribe, unique Groupby & CrossTab & Pivat Table Gierarchical Index Aggregation Transformation Merge & Concat Join 1번과 2번 예제 설명은 여기를 참고 총 3개의 예제가 있다! #1. 답안코드 # 첫번째 방법 : gr..

[머신러닝을 위한 파이썬] 2. numpy 활용 예제 [내부링크]

이 글은 boostcourse 강의를 듣고 작성한 글입니다. >>알아야하는 문법 numpy 배열 생성법 0 배열 / 1 배열 생성법 shape / reshape concatenate axis indexing VS slicing Operation, Comparison Boolean Index Fancy Index BroadCasting 배열 저장, pickle >>신경 써야하는 부분 numpy는 c스타일 배열 => 기존 파이썬 배열보다 빠르다. numpy 메서드가 복사된 배열을 반환하는지, 참조하는지 구분해야한다!! => 나중에 큰 데이터를 다룰 때 필요 연산 시에 BroadCasting이 어떻게 되는지 알아야된다. shape이 1차원인지 2차원인지 [1,2,3,4,5] => 1차원, [[1,2,3,4,5..

[머신러닝을 위한 파이썬] 1.행렬 연산 구현해보기 [내부링크]

이 글은 boostcourse 강의를 듣고 정리한 글입니다. 밑에 나오는 구현 예제들은 모두 한줄로 작성이 가능하다! ( 과연 한 줄로 코드를 작성하는 게 더 좋을까...? ) >>완벽하게 알아야 할 자료구조 리스트 튜플 딕셔너리 >> 공부해야 할 문법들 List Comprehension / Generator Enumerate Zip Lambda Map Asterisk 예제는 여기서 확인하자 >>파이썬 답안 코드 #1. def vector_size_check(*vector_variables): return len(set([ len(vector) for vector in vector_variables])) == 1 #2. def vector_addition(*vector_variables): if vect..

[Python 뜯어보기] 2.극한의 '객체'충 파이썬 [내부링크]

이번 공부를 하면서 얻은 교훈! C 와 Python 의 가장 큰 차이점이 무엇인지 느껴졌다!! C는 함수 호출 시 스택 메모리에 로드하고, 빠져나올 때 의미를 잃어버린다. Python은 함수를 네임스페이스 라는 공간에 정의를 한다. 함수까지도 객체화 해버렸다. 여기서 많은 차이가 발생하는 것 같다. 마치 레고? 로봇? 같은 느낌이다. 우리가 쓰는 모든 변수는 잘 만들어진 로봇의 부품들을 하나하나 가리키는 용도일 뿐이다. C는 주물작업으로 직접 레고 부품을 하나하나 만들고, 만들어진 부품을 내 손으로 직접 쌓는 느낌 Python은 절대 내 손으로는 그 부품을 만질 수 없다. 내가 타워 크레인이 된 것처럼 이미 잘 만들어진 것들을 이리저리 옮겨서 쌓는 느낌이다. C는 장인의 손길이 느껴지는 반면, Pytho..

[MySQL] 프로그래머스 SQL 고득점 kit - SELECT문 [내부링크]

아래와 같은 테이블이 있다고 하자. 예제1) 모든 레코드 조회하기 SELECT * from animal_ins order by animal_id; 예제2) 역순으로 조회하기 SELECT NAME,DATETIME from animal_ins order by animal_id desc; 예제3) 아픈 동물 찾기 SELECT ANIMAL_ID, NAME from animal_ins where intake_condition = "Sick" order by animal_id; 예제4) 어린 동물 찾기 SELECT ANIMAL_ID, NAME from animal_ins where intake_condition != 'Aged' order by animal_id; 예제5) 동물의 아이디와 이름 SELECT ANIM..

[MySQL] 프로그래머스 SQL 고득점 kit - GROUP BY문 [내부링크]

아래와 같은 테이블이 있다고 하자. 예제1) 고양이와 개는 몇마리 있을까 SELECT ANIMAL_TYPE, count(animal_type) as 'COUNT' from animal_ins group by animal_type order by animal_type; 예제2) 동명 동물 수 찾기 SELECT NAME, COUNT from ( SELECT NAME, count(NAME) as 'COUNT' from animal_ins where NAME != '' group by NAME order by NAME ) sq1 # sub-quary, select문은 테이블을 반환. 반환된 테이블은 이름을 반드시 갖고 있어야 함. where COUNT > 1; 예제3) 입양 시각 구하기1 SELECT hour(..

[MySQL] 프로그래머스 SQL 고득점 kit - max/min/count [내부링크]

아래와 같은 테이블이 있다고 하자. 예제1) 최대값 구하기 SELECT datetime as 시간 from animal_ins order by datetime desc limit 1 # 또는 SELECT max(datetime) as 시간 from animal_ins 예제2) 최소값 구하기 SELECT datetime as 시간 from animal_ins order by datetime limit 1; # 또는 SELECT min(datetime) as 시간 from animal_ins; 예제3) 동물의 수 구하기 SELECT count(*) as "COUNT" from animal_ins; 예제4) 중복 제거하기 SELECT count(distinct name) as 'COUNT' from anima..

백준 [BOJ] 10217 : KCM travel [내부링크]

10217번: KCM Travel 각고의 노력 끝에 찬민이는 2014 Google Code Jam World Finals에 진출하게 되었다. 구글에서 온 초대장을 받고 기뻐했던 것도 잠시, 찬찬히 읽어보던 찬민이는 중요한 사실을 알아차렸다. 최근의 대세 www.acmicpc.net 조건이 있는 최단거리를 찾는 문제. 한 도시에서 다른 도시로 가는 최단 거리를 찾는 것이므로 이런 경우에는 다익스트라 알고리즘을 쓰는게 좋다고 알려져있다. 단순 dfs / bfs 를 사용하는 경우는 가중치가 모두 같은 경우이다. 방문했던 곳에서는 다시 탐색을 진행하지 않는 특성 탓이다. 시작점 ~ 방문해야 할 지점까지의 거리를 s라고 하자. 만약 가중치가 다른 상황에서 이미 방문했던 곳을 재방문했다고 해보자 재방문 했을 때 기..

[Python 뜯어보기] 1. 파이썬은 어떻게 문장을 인식할까? [내부링크]

이 글은 문서를 참고했습니다. 처음 프로그래밍을 배울 때가 기억난다. Visual Studio 를 이용해서 C/C++ 을 배울 때였는데, 내가 선언한 변수들이 알록달록 예쁜 색으로 변하고, 논리적인 문장, 문단을 실시간으로 구분하는 프로그램이 너무 신기했다. 파이썬이 C 기반으로 만들어진 언어라는 점을 인식하면서 공부하다보니, 이런 기억들이 새록새록 떠오르면서, 프로그램이 문자,문장을 구분하고 인식하는 방법에 대해 궁금해졌다. 레퍼런스에는 아래와 같이 기술되어 있다. - BNF 문법 표기법?? : 배커스-나우르 표기법(Backus–Naur form) 이라고 불리며, 문맥 무관 문법을 나타내기 위해 만들어진 표기법이다. 컴퓨터가 글을 이해할 수 있도록 하는 기초적인 모델,, 같은 느낌이다. 검색해서 간단하..

[Python 뜯어보기] 0. 파이썬을 공부하기로 결심한 이유 [내부링크]

근래 일주일 동안 많은 고민들이 있었다. 하루종일 컴퓨터 앞에 앉아 공부만 하다보니, 방향성 없이 무턱대고 공부만 하는듯한 불안감이 생겼다. 어떤 방향으로 진로를 구체화 시켜야할까. 내가 정말 좋아하고, 즐겁게 오래 공부할 수 있는 분야가 무엇일까. 실제 현장에서 어떤 기술들이 요구되는지 학부생의 입장에서는 감이 오지 않았다. 그래서 취업 사이트에 올라와 있는 구인 글을 많이 보면서 정리해보려고 했다. 임베디드, 시스템 프로그래밍, 암호학 등 기계 느낌 나는 분야 웹 기반 소프트웨어처럼 사람에게 더 가까운 분야 빅데이터 처리 기법 / 알고리즘 개발 등의 연구분야 크게 이렇게 세가지로 나누어 보았다. ① 기계 느낌 나는 분야. - 리눅스 커널 같은 시스템 프로그래밍 같은 곳 - 직접적으로 메모리를 다루어야..

백준[BOJ] 1707번 : 이분그래프 - BFS, DFS [내부링크]

1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 www.acmicpc.net BFS, DFS를 연습하기 좋은 문제라는 생각이 든다. 처음에 이분 그래프의 개념을 아예 몰라서, 이진트리를 의미하는 줄 알고 한참 고생했다.... 그림으로 보면 이해가 빠르다. 아래와 같다. 인접한 정점을 다른 색으로 모두 칠할 수 있으면 이분 그래프이다. 이분 그래프의 특징 인접한 정점들을 다른 색을 구분할 수 있다. 순환할 수 있다.(2가지 색으로 구분 가능하면 된다.) 최대 이분 매칭 문제(Maximum Bipartite Matching Pr..

이식성(Portability), 표준의 중요성! [내부링크]

백준 온라인 저지[BOJ]에서 10942번 문제를 풀던 중, 며칠에 걸쳐 '우연히' 알게 된 사실! bool dp[2001][2001]; // // 중략 // cout

백준[BOJ] 1520번 : 내리막길 [내부링크]

1520번: 내리막 길 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으 www.acmicpc.net 처음 문제의 이미지를 보자마자 깊이우선탐색/넓이우선탐색 문제일것이라는 생각이 들었다. 경로의 개수를 찾아야하는 이 문제에서는 DFS가 적합하다는 직감이 느껴졌다. 이 문제에서는 여러 종류의 경로가 서로 중첩되는 경우를 반드시 고려해야한다. 만약 BFS로 탐색을 진행하게 되면 가능한 모든 경로를, 같은 깊이로, 탐색을 진행한다. 이 때에는 (다른 깊이, 같은 지점)에서 만났을 경우를 처리하는 게 복잡하다고 생각된다. 이 글 쓰고 나서 시도해봐야겠다. DFS로 가능한 하..