테스트 코드가 중요한건 개발자라면 누구나 인지하고 있다.하지만 생각보다 테스트 코드를 작성하는게 쉽지가 않다.어디부터 작성을 해야 하는걸까?뭘 어떻게 작성을 해야 하는걸까?그러다 개발이 종료된 이후에 테스트 코드를 도입하게 된다.그러면 의문이 드는게 검증이 되었는데 테스트 코드를 왜 짜는지에 대한 회의감이 들기 시작한다.결국 테스트코드는 작성하지 않는 꼴이 되버린다. 또 문제가 개발을 2번하는 느낌이 든다.이상하다. 분명 테스트 코드를 중요하다고 해서 테스트 코드를 짜는데 이게 따로 일을 하는 느낌이 든다.마치 구현 작업과 테스트 코드 작성 작업이 분리된 느낌이다.이게 나쁘다는게 아니다. QA테스트 같은 경우 개발이 완료된 이후에 QA가 테스트를 하게 된다.그러면 결국 2가지일을 따로 하게 될 수 도 있..
오랜만에 면접 공부를 진행하자.이 내용은 스파르타에서 진행했던 내용들을 토대로 정리한 내용이다.1. @Component, @Service, @Repository, @Controller 차이이 네 가지는 모두 스프링 컨테이너에 빈으로 등록되도록 도와주는 컴포넌트 스캔의 대상 어노테이션입니다.하지만 역할 구분과 내부 동작이 다릅니다.어노테이션설명@Component가장 일반적인 컴포넌트 등록용 어노테이션@Service비즈니스 로직을 담는 클래스에 사용. AOP 적용 시 의미 있는 대상@RepositoryDAO 계층에 사용. 스프링이 JDBC 예외를 DataAccessException으로 변환@Controller웹 요청을 처리하는 컨트롤러 클래스에 사용기존에 생각했을때 확인 목적으로 사용이 된다고 생각헀었다. ..
프로젝트에 선차감 방식을 도입하려고 합니다. 이 방식은 요청이 들어왔을 때 미리 자원을 차감하고, 대기 큐로 메시지를 전달할 수 있기 때문에 효율적인 흐름 제어가 가능합니다.하지만 선차감은 동기 방식으로 작동한다는 점이 고민입니다. 동기 방식 자체가 문제라기보다는, 이를 레디슨(Redisson) 분산 락과 함께 사용할 때 병목이 생길 수 있다는 점이 우려됩니다.레디슨은 분산 환경에서 락을 걸기 위한 네트워크 통신이 포함되어 있고, 여기에 동기 코드가 포함되면, 락 획득까지의 대기 시간이 누적될 수 있습니다.즉, 락을 기다리는 동안 동기 코드가 블로킹되면 전체 처리량이 감소할 수 있는 것이죠.그렇다고 선차감 로직을 비동기로 전환하면, 락 대기 시간은 줄어들 수 있지만, 정합성 문제가 발생하게 됩니다.실제로..
왜 이름을 프리스타일로 했는지는 알 수 없지만 젠킨스 프리스타일은 젠킨스에서 GUI로 CI/CD를 할 수 있게 제공하는 기능이라고 생각하면 된다.그러면 프리스타일을 어떻게 하면 파이라인으로 바꿀 수 있을지 생각해보자.일단 CI/CD를 하기 위해서는 코드가 필요하다. 코드를 가져올 수 있는 방법은 크게 2가지가 있는데직접 가져오는 방법이 있겠고 깃에서 가져오는 방법이 존재한다.근데 사실상 직접 넣으면 젠킨스로 CI/CD를 하는 이유가 전혀 없을 거 같다.그렇다면 젠킨스는 어떻게 코드를 가져올 수 있을까? 이 그림은 젠킨스-프리스타일로 할때 깃에서 코드를 가져오는 구문이다.이렇게 되면 깃에서 코드를 가져올 수 있게 된다.다른 방안이 있는지는 잘모르겠지만 아무튼 이것을 프리스타일이 아닌 파이프라인으로 변경하면..
젠킨스를 학습을 하고 있는데 어떤식으로 학습을 해야 할지 막막했다.그래서 튜터님께 어떤것을 학습을 하면 좋을지 여쭤보았다. 그리고 나온 결과가 다음과 같다.- Jenkins 가 CI/CD에서 어떤 역할을 하는지? - 아키텍처 master-worker (agent) - 주요 구성요소(job, build, executor, node, label, workspace)- 각 배포환경에 따라 달라지는 Jenkins의 구성 (예정)- pipeline 공부 (Jenkinsfile) (예정)- 대표적으로 사용하는 플러그인 적용해보기 (git, git webhook, credentials, secret text등..) (예정)그리고 추가적으로 ec2와 통신을 step by step으로 알려주셨다.1. 젠킨스에서 ec2에..
오늘 JPA에 대한 면접 질문을 받았다.대부분 원리에 대한 질문들이었다. 하지만 나는 재대로 답변하지 못했다.ㅜㅜ질문은 총 6문제로 다음과 같은 질문이 있었다.JPA 엔티티 라이프 사이클 상태 설명N+1 문제와 FetchType(EAGER/LAZY)의 연관JPQL과 네이티브 쿼리 사용 시 영속성 컨텍스트 주의점@Transactional의 동작 원리낙관적 락 / 비관적 락의 차이 및 적용 방식QueryDSL 사용 시 영속성 컨텍스트를 타지 않는 경우첫 번째 질문같은 경우 엔티티가 어떻게 동작하는지 설명하는거였다. 제대로 설명하지 못했다.ㅜㅜ이건 내가 노션으로 정리할때 빼먹고 안적어 둔거 같다.암튼 요거는 엔티티가 어떻게 관리가 되어지는지 말해보라는건데... 쉽지 않았다.JPA 엔티티는 총 네 가지 라이프사..
클래스 멤버 변수 초기화 순서에 대해 설명해주세요.의존성 주입(DI, Dependency Injection)에 대해 설명해주세요. Spring Filter와 Interceptor에 대해 설명하고, 사용 예시를 설명해주세요.@Transactional에 readOnly 속성을 사용하는 이유에 대해서 설명해주세요.JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?이렇게 총 5가지로 질문을 주셨다.뭔가 java와 스프링을 섞어서 질문을 주셨다.대부분 아는거이긴 한데 이번에도 정리가 좀 부족하다는 생각이 들었다.그리고 5월초아니면 국비종료한후에 지금까지 질문받았던 내용들을 한번더 정리하는 시간을 갖는것이 좋을거 같다.1번 질문 같은 경우는 클래스 맴버 변수에 대해 알아야 할거..
Clustered Index / Non-Clustered Index 에 대해 설명해주세요.IN 절에 들어갈 수 있는 최대 항목 수에 대해 알고 계실까요?인덱스를 타지 않거나 혹은 기대하는 성능을 못내는 경우는?트랜잭션 격리 수준에 대해 설명해주세요.이렇게 4문제를 정리를 하려고 한다. 눈에 띄는건 격리 수준에 대해 설명은 일부러 또 넣었다. 왜냐하면 굉장히 중요하다고 생각했기 때문이다.암튼 내가 제일먼저 학습을 해야 하는 부분은 클러스터라는 개념이다.과연 클러스터라는 건 무엇일까?찾아보니 클러스터는 군집,집단이라는 뜻이다.이걸 생각해보고 첫번째 질문부터 다시 생각해보자.첫번째 질문은 클러스터 인덱스와 논 클러스터 인덱스를 뜻한다.클러스터 인덱스는 군집의 대빵이 될 수 있는 인덱스로 자동적으로 정렬이 된다..
오늘은 모의 면접 복기나 해보자.1. MySQL에서 SQL 쿼리는 어떤 순서로 실행되나요?2. 커버링 인덱스란 무엇인가요?3. SQL Injection이란 무엇이고, 어떻게 방지하나요?4.COUNT(*) vs COUNT(1) vs COUNT(컬럼) vs COUNT(DISTINCT 컬럼)의 차이는?5. WHERE 컬럼 IS NULL 조건을 주면 인덱스를 탈 수 있을까요?6. MySQL에서 트랜잭션 격리 수준의 종류와 차이를 설명해주세요.이렇게 총 6가지 질문을 받았다. 일단 내가 준비한거에서 나오지 않아 굉장히 실망스러웠지만.. 뭐 어쩌겠나 이번에는 그래도 자신있게 말했던거 같다.다만 횡설수설하게 말하는 경향이 있어서 아직은 조금 부족한감이 있는듯하다.첫번째 질문같은 경우는SELECT DISTICT o.s..
정처기도 함께 공부하고 있어서 정규화도 이번에 한번 정리해보고3. 리플리케이션4. 파티셔닝 5. 샤딩 6. 인덱스 이렇게 학습을 해보자 이번엔그러니까 5가지를 학습할예정이다.정규화 같은 경우는 DB의 종복을 제거하고 이상현상을 제거하기 위한 방법이라고 생각하면 된다.하지만 조회 성능은 떨어진다고 알고 있다. 그럴땐 반정규화로 다시 데이터를 늘리는 방법을 선택할 수 있다. 또한 정규화에는 1~5까지 총 6가지가 존재한다. 원부이결다비 이거였나.. 원자성 부분 이행 함수 결정자 다중값 비손실 분해이건데.. gpt는 어케 대답하는지 보자정규화는 실무에서 테이블 설계를 할 때 중복을 줄이고 데이터 무결성을 유지하기 위해 사용하는 기본적인 기준입니다.하지만 모든 상황에 3NF 이상 정규화를 철저하게 적용하기보다는..
db같은 경우는 내 멘토님이 요런거를 공부하라고 하셔서 몇가지만 다시 적어보려구 한다.1. CAP & PACELC 이론2. 클러스터링3. 리플리케이션 (아직)4. 파티셔닝 (아직)5. 샤딩 (아직)더 많지만.. 다시 정리하는 차원에서 하는거니까..일단 요정도만 하장db는 그래도 내가 열심히 조사했으니 괜찮겠지..첫번째 cap&pacle이건 분산시스템에서 만족할 수 없는 원칙이라고 한다. 둘중 CAP이 만족할 수 없는 원칙이다.PACLE은 다른거이므로조금있다 작성예정이다. CAP은 약자로 일관성,가용성,네트워크 분할 하용이 존재하고 이들중 두개만 만족을 시킬 수 있다고 한다.더욱이 MSA환경에서는 네트워크 분할은 무조건 가져가야 하므로 일관성과 가용성중 하나를 포기를 해야 할듯싶다.근데 뭐가 더 중요할까?..
오늘을 끝으로 자바는 당분간 마무리짓고 DB를 진행할 예정이다. 아 학습안한건 어떻하냐고.. 걔네는 나중에 정리해야지.. 근데 당분간은 못할거 같다.다른것도 해야지... 해야지.. 아무튼 오늘은 내가 개인적으로 모의면접을 부탁해서 고것들을 위주로 학습할예정이다.수정되있는게 있으면 반영해야지1. callByValue vs callByReference 2. 이펙티브 final -> 람다 캡쳐링3. Runnable vs Thread 4. for문 vs 람다 forRoop 5. equals에서 hashcode의 관계요렇게다 문제 순서는 저렇지는 않는데... 암튼 고건 중요한게 아니구callByValue vs callByReference 요거같은 경우는 자바에서는 어떤것을 지원하는지 물어보는 질문이었다.이게....