2024.08 매주 코테 스터디정처기 실기교내 해커톤 참여졸업 프로젝트 마무리2025 상반기 취업을 목표로 기본기와 실무지식을 쌓고, 이력서와 포폴을 완성하고자 부트캠프에 지원했다.부트캠프에 들어간 이유는 "기업과 협업"을 할 수 있는 기회가 있었기 때문이다.중고신입이 대세인 상황에서 인턴조차 하지 못한 나에겐 이걸로 내가 중고 신입이라는 걸 어필할 수 있겠다. 라는 생각이 들었다. 이때 정처기 실기와 매주 코테 스터디, 해커톤에 참여하였다.이 달은 유의미한 시간은 아니었던 거 같다. 그저 졸업프로젝트가 잘 마무리 되었으면 하는 마음이 컸다. 2024.09매주 코테 스터디실제 코테 응시졸업 프로젝트 끝부트캠프 프로젝트 진행개강이때부터 실제 기업에 지원하여 코테를 볼 수 있는 기회가 있었다. (물론 다 떨..
이전 포스팅에서 좋아요 동시 요청에서 데드락이 걸린 것에 대해 분석해 보았다.원인 요약좋아요를 저장하는 과정에서 like 테이블에 board 외래키가 있었고, 외래키로 인해 board의 레코드가 잠김(slock).정확히는 mysql에서는 인덱스 락인데 편의상 레코드 락이라고 하겠다.트랜잭션1: 좋아요 추가(board id = 1 레코드 slock)트랜잭션2: 좋아요 추가(board id = 1 레코드 slock)트랜잭션1: board id = 1 레코드 좋아요 수 update(xlock 획득하기 위해 대기)트랜잭션2: board id = 1 레코드 좋아요 수 update(xlock 획득하기 위해 대기)이 상황이라면 좋아요를 누르는 동시에 해당 게시물을 수정하는 일이 생긴다면 이때도 데드락 발생 가능Loc..
배경Mysql 8.0, Spring Boot 3, java 17 사용학교 게시판에 좋아요 기능이 있는데, 트래픽이 많아질 경우 좋아요 동시성 문제를 생각해 보게 되었다.유저 3개를 만들고 포스트맨의 collection을 활용해서 테스트를 해보았다.결과는 둘다 200 OK가 떳다.이는 포스트맨의 방식이 Delay가 아무리 줄어도 동기 방식이기 때문에 병렬로 동시에 보내는 요청이 아니고 순차적인 요청이었기 때문이었다. 그래서 원시적인 방법으로 curl로 테스트 해보기로 했다.터미널에 각 유저에 대한 요청 3개를 동시에 보냈다.curl --location --request POST 'http://localhost:9090/api/board/like?board_id=1' \--header 'Authorizati..
좋아요 동시성 테스트를 하다가 "데드락"이 발생하는 걸 보았다. 이를 해결하기 위해 Transaction 격리 수준에 대한 개념을 제대로 잡고, 해결하고자 작성하는 글이다.먼저, MySQL 을 사용하고 있어서 MySQL이 사용하는 락에 대해서 살펴보다가 동시성 제어를 위한 MVCC 의 등장 배경을 정리하고자 한다. 고전적인 락MVCC 등장 이전에 공유락(S-lock), 배타락(X-lock)으로 동시성 제어를 하고 있었다. 하지만 이 방식은 데이터 일관성을 보장해주지만 너무 느리다는 단점이 있다.공유락(Shared Lock)나 이 데이터 읽을 거예요.다른 읽는 트랜잭션? 오케이, 같이 읽자. 근데 누가 수정하려면, 내가 다 읽고 나서 해 주세요.공유락은 위와 같이 읽기 잠금이다. 내가 다 읽을 때까지 동일..
C언어에서 LinkedList라는 자료구조를 사용하려면 직접 구현해야함 → 자바는 JCF에서 만들어놓은 클래스를 사용하면 됨.💡 직접 구현하는 것과 JCF 사용하는 것 중 무엇이 좋은가?만들어 놓은데는 다 이유가 있다..알고리즘의 속도와 안정성에 있어 자바 언어 개발진들이 수십년에 걸쳐 JVM에 최적화시켜 개량해왔으니 우리는 그걸 가져다 쓰면 된다. 장점인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화 되어 있기에, 사용법을 익히기에도 편리하고 재사용성이 높다데이터 구조 및 알고리즘의 고성능 구현을 제공하여 프로그램의 성능과 품질을 향상관련없는 API 산의 상호 운용성을 제공 (상위 인터페이스 타입을 업캐스팅하여 사용) → 인터페이스 중심으로 사용 → 객체지향적이미 구현되어 있는 API를 제공..
문제 상황study 엔티티에 studyStatus 속성에 디폴트 값으로 TODO 로 설정하려고 아래와 같이 설정해주었다 @ColumnDefault("TODO") @Enumerated(EnumType.STRING) private StudyStatus studyStatus = StudyStatus.TODO; //강의 상태 근데 아래와 같은 오류 발생Error executing DDL "create table study (likes integer default 0, progress integer default 0, study_id integer not null auto_increment, study_order integer, user_id integer, create_at datetime(6)..
@ComponetScan컴포넌트 스캔 실습 코드 AppConfig에서 `@Bean`으로 모두 등록해주었다. 빈으로 등록해야한게 수백만개가 된다면 일일이 등록하기 너무 귀찮고, 설정 정보도 커지게 된다.`@ComponetScan` 을 설정 정보에 붙여주면 된다.AutoAppConfig파일 구조는 다음과 같다프로젝트 최상단에 AutoappConfig.java가 있으므로 프로젝트에서 컴포넌트로 등록해준 것을 다 빈으로 등록한다.@Configuration//@ComponentScan: 스프링 빈을 다 끌어다가 자동으로 스프링 빈으로 끌어올리는..@ComponentScan( //스프링 빈 등록에서 제외할 것 excludeFilters = @ComponentScan.Filter(type =..
싱글톤 패턴애플리케이션을 개발하면 여러 고객이 동시에 요청을 보내게 된다.스프링 없이 AppConfig를 사용해서 컨테이너를 생성하게 되면 매 요청마다 객체를 생성하게 된다.고객 트래픽이 초당 100이 나오면 초당 100 개 객체가 생성되고 소멸된다. -> 메모리 낭비싱글톤 패턴을 적용한 코드는 아래와 같다.public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private static final SingletonService instance = new SingletonService(); //2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다. public static SingletonS..
스프링 컨테이너 생성자바 설정 클래스를 기반으로 스프링 컨테이너 생성할 수 있다.new AnnotationConfigApplicationContext(AppConfig.class);AnnotationConfigApplicationContext는 ApplicatinContext 인터페이스의 구현체이다.AppConfig.class 에 있는 구성 정보를 활용해서 컨테이너 생성 빈 이름빈 이름은 메서드 이름을 사용아래와 같이 빈 이름은 직접 부여할 수도 있다.@Bean(name="memberService2") 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다.자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다. 스프링 빈 조회 - 상속 관계부모 타입으로 조회하면..