본문 바로가기

전체 글64

[Linux] 리눅스에 대해 알아보자 + 기본 명령어 처음 리눅스에 대해 알게 된 건 어릴 때 영화에서 해커를 보면 검은 화면에 영어가 빠르게 올라오는 장면을 보고 알게 되었다. 이후 컴퓨터에 대해 공부를 하면서 리눅스에 대해 알게 되었고 그 당시에는 리눅스가 어떠한 것을 하기 위해서 사용이 되는지 몰라 학습을 회피를 하였다. 현재 개발자를 꿈꾸면서 리눅스는 선택이 아닌 필수가 되었고 기존에 알고 있는 내용과 배포를 하면서 알게 된 내용을 정리하기 위하여 이 글을 작성하였다. 1. 리눅스에 대해 알아보자 1. 리눅스란 윈도우 , MacOS 같은 컴퓨터의 운영체제이지만 조금 다른 부분이 있다. 윈도우 , MacOS는 흔히 GUI(Graphic User Interface)란 우리가 지금 사용하고 있는 컴퓨터에 화면처럼 모든 요소들이 화면에 그림으로 나타나서 사.. 2023. 3. 2.
Spring Boot Test H2 In Memory 설정하기 테스트를 하기 위해서 local에 DB를 실행을 해야되는데 이것을 In Memory를 통하여 local에 실행하지 않고 테스트가 가능하다. 우선 설정을 위해서 src/test 에서 resources 디렉토리를 추가해 주고 application.yml도 추가해준다. 이렇게 추가된 application.yml은 test시 main directory 하위에 있는 application.yml보다 우선권을 가지게 된다. spring: datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: .. 2023. 2. 28.
MySQL - 인덱스 인덱스를 왜 사용해야 되는지 알기 위해서는 디스크 읽기 방식에 대해 공부를 해야된다. 이 포스트는 인덱스에 관련된 내용이기 때문에 디스크 읽기 방식에 대해 간단하게 설명하고 넘어가겠다. 2개의 읽기 방식을 이해하면 좋은데 랜덤I/O와 순차I/0 방식이다. 랜덤I/O방식과 순차I/O 방식의 공통적인 행동이 있는데 플래터를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는다. 하지만 여기서 차이가 나는 부분은 순차I/O는 1번의 시스템 콜을 호출하고 랜덤I/O는 3번의 호출을 하였다. 이렇게 살펴보면 순차I/O를 사용하면 효율이 좋겠지만 기본적으로 랜덤I/O를 사용하고 있는 MySQL을 현실적 특성상 순차I/O로 변경하기는 어렵다. 그래서 랜덤I/O를 사용을 하면서 접근하는.. 2023. 2. 28.
MySQL - 격리 수준 MYSQL 격리 수준 격리 수준 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 테이블을 볼 수 있게 처리를 할 것인지 결정하는 것이다. 1. Read Uncommitted Read Uncommitted 격리 수준은 각 트랜잭션에서 변경 내용이 commit , Rollback 여부에 상관없이 다른 트랜잭션에 보인다. (Dirty Read) → 사용자 A가 insert를 하고 사용자 B가 commit 이 되지 않은 데이터를 select로 접근을 한다. → 만약에 Insert 하는 경우에 오류가 발생하여 롤백을 하게 된다면 사용자B는 어떤 데이터를 접근을 하고 있을까? — 롤백이 되지 않은 데이터를 접근 → 이처럼 Read Uncommitted는 정합성에 많은 문제가 .. 2023. 2. 28.
MYSQL - LOCK Lock 락은 기본적으로 동시성을 보장한다. 즉. 락은 동시성을 제어할 때 락의 범위를 최소화를 하는게 중요하다. 왜냐하면 락의 범위가 길어지면 대지중인 커넥션이 많아지고 나중에는 커넥션 풀이 고갈로 이어질 수 있다. 기본적으로 MySQL에서는 트랜잭션 커밋 , 록백시점에 락이 풀린다. 트랜잭션이 곧 락의 범위가 된다고 생각하면 된다. MySQL에서 락은 크게 InnoDB 엔진 , MySQL 엔진 레벨로 나눌 수 있다. 📌 비관적 동시성 제어(PCC, Pessimistic Concurrency Control) 비관적 락이라고도 하며 트랜잭션이 충돌하는 가정하에 잠금을 거는 방식 일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다. 📌 낙관적 동시 수행 제어(OCC, Opti.. 2023. 2. 28.
코드숨 스프링[15기] - 3주차 회고록 이번 주에 했던 작업 JUnit 5 , MockMVC을 이용한 첫 테스트 코드 작성 AssertJ , Mockito를 이용해서 테스트 작성 Given , When , Then 테스트 코드 작성하면서 느낀점 코드의 작성은 개발자가 하지만 그 코드를 보는 사람을 생각하며 작성하자 코드의 작성은 개발자가 하지만 테스트 코드는 비즈니스 로직을 검증 이외에 다른 사람들에게 쉽게 내가 생각한 로직을 명확하게 표현을 할 수 있다고 생각한다. @Nested , @DisplayName에 명확한 이름을 사용하여 가독성을 높이는게 생각보다 더 중요하다고 느꼈다. 빠르게 검증이 가능하다. 기존에 프로젝트를 하면서 테스트를 하는것 보다 빠르게 시나리오를 만들어서 로직을 검증을 하니 개발에 대한 시간이 줄어들고 에러를 더 쉽게 .. 2023. 2. 26.
코드숨 스프링[15기] - 2주차 회고록 이번 주에 했던 작업 Spring 웹을 이용한 Todo Rest Api 구현을 만들었다.( 1주차에는 스프링을 사용하지 않았다.) 스프링을 사용하고 느낀 점 코드숨을 하기 이전에는 스프링 프레임워크를 사용을 해봤으나 스프링을 사용하지 않고 비교를 해본 적이 없었다. 프레임워크를 사용하고 기존에 작성한 코드가 간단해지고 가독성이 좋아졌다.기존에 알고 있던 프레임워크의 기술을 더 자세하게 학습하고 어떤 점에서 더 편리하게 사용을 할 수 있는지 학습하는 기회가 되었다. 이번 주에 사용한 기술 Spring Boot , Spring Web Marko.js , Axios Springboot - dev - tools @CrossOrigin 스프링 프레임워크를 사용을 하였고 스프링 부트를 처음 사용을 해보았다. 물론 .. 2023. 2. 19.
[SpringBoot] Slack으로 알림 보내기 소개 요즘 Slack을 자주 사용하게 되어서 Spring boot를 통해서 Slack에 알림을 보내기를 시도했다. 1. 워크스페이스 및 채널 - 일단 기존에 있는 채널을 사용을 했는데 만약에 프로젝트를 한다면 새로운 채널을 만드는 방법을 추천한다. 2. 서브 채널 -> 세부정보 보기 - 서브 채널을 하나 선택을 하고 욱클릭을 하여 채널 세부정보 보기를 선택한다. 3. 통합 -> 앱 -> 앱추가 4. 검색 -> webhook 검색 검색을 할 때 webhook을 검색하여 Imcoming-webook을 설치한다. 5. URL 확인 Slack api 사이트에 들어가서 Add Incoming WebHooks Integration을 누르면 밑에 화면이 나오는데 여기서 URL을 복사한다. 5-2. webhook 테스.. 2023. 2. 15.
코드숨 스프링[15기] -1주차 회고록 https://www.codesoom.com/courses/spring 최근 많은 개발자들이 꿈꾸는 회사들의 요구사항 입니다. 테스트 코드 작성은 혼자서 훈련하기 굉장히 어렵습니다. 숙련자의 도움이 없으면 올바른 방향으로 작성하기 어렵기 때문이죠. 코드 www.codesoom.com 코드숨을 신청한 이유 개발자가 되기 위해서 나는 국비지원과 인프런에서 학습을 했다. 물론 이 2개만 해서 취업이 가능하겠지만 내가 지금 작성한 코드가 잘못된 방식으로 작성을 한다고 느끼고 있고 이러한 부분을 피드백을 해주는 사람이 없었다. 그래서 취업이 늦더라도 코드숨을 신청을 하게 되었다. - [ 좋은 코드의 틀 ] 사실 코드숨에 지원을 가장 큰 이유이다. 테스트 코드에 대해 배우고 싶었고 좋은 방법으로 코드를 작성을 하고.. 2023. 2. 14.
MySQL 엔진 아키텍처 🚩 MySQL 엔진 아키텍처 MySQL아키텍처에 대해 알아보자 MySQL 서버는 크게 MySQL 엔진 + 스토리지 엔진이 있다. MySQL엔진 크게 3가지 기능을 한다. (쿼리 파싱, 쿼리 오티마이징, 쿼리 실행을 한다.) 쿼리 파싱 개발자가 프로그래밍 언어로 DB에 쿼리를 보내면 SQL이 이해 가능하게 변경한다. 쿼리 오티마이징 파싱을 통해 변경된 내용을 오티마이징을 하여 최적화를 한다. 쿼리 실행 쿼리를 실행한다. 스토리지 엔진 MyISAM 처음에 기본 엔진으로 사용을 하였다. 키 캐싱이라는 장점을 가지며 트랜잭션을 지원하지 않는다. InnoDB 버퍼링, FK제약 조건, 충돌 복구, 트랜잭션을 지원하여 주로 InnoDB를 사용한다. 메모리 캐시를 통하여 디스크I/O 작업을 줄여 성능을 향상(버퍼 풀).. 2023. 2. 10.
Hello, World! 2023 😛 늦었지만 23년을 시작하면서 글또와 내가 지금 하고 있는 활동정리 1-1. 글또 -23년 1월 나는 글또 8기 멤버로 참여하게 되었다. 처음에 글또를 알게 된 건 국비지원에서 만난 형으로부터 알게 되었다. 글또에 대해 찾아보니 개발에 대한 자신의 이야기나 경험을 글로 표현하고 다양한 활동을 통해 소통을 하는 느낌을 받았고 좋은 사람들이 많이 모인다는 걸 알게 되었다. 이후 국비지원이 끝날 때쯤 글또 8기에 신청을 하게 되었고 운이 좋게 선정이 되었다. - 글또에 대한 작성 글을 쓰면서 내가 언제 처음 블로그를 운영을 했는지 생각하게 되었다. 아마도 개발자가 되겠다고 생각을 하고 국비지원을 다니면서 주변의 친구들의 영향으로 처음 시작을 했던 것 같다. 그 당시에는 하루에 1개 글을 작성을 노력을 했으나 이.. 2023. 2. 7.
JPA 영속성 컨텍스트 EntityManager Factory EMF는 클라이언트의 요청을 받으면 Entity Manager를 생성을 해주는 역할을 한다. 이후 EM이 커넥션풀을 이용하여 DB와 데이터를 주고 받는다. 영속성 컨텍스트( 엔티티를 영구 저장하는 환경) 애플리케이션과 데이터베이스 사이에 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티의 생명주기 비영속 영속성 컨테스트와 관계가 없는 새로운 상태 Member m = new Member(); member.setId("1"); 영속 영속성 컨텍스트에 관리되는 상태 Entity Manager의 영속성 컨텐스트를 통해서 Entity가 관리가 된다. Member member = new Member(); member.setUserName("김무건"); member.. 2023. 2. 4.