전체 글 99

퀵 정렬

Java의 Arrays.sort는 듀얼피봇 퀵정렬(Dual-Pivot QuickSort)을 사용한다. 듀얼 피봇 퀵정렬은 피봇을 2개를 두고 3개의 구간을 만들어 퀵정렬을 진행한다는 것이다. 이 방식은 하나의 피봇으로 진행하는 퀵 정렬에 비해 좋은 성능을 낸다고 알려진다. 그 이유는 퀵 정렬의 경우 최악의 경우의 피봇을 잡았을 때 (오름차순에서 가장 작은 수 or 내림차순에서 가장 높은 수) 버블정렬과 같은 시간 복잡도가 나온다. 때문에 평균은 O(nlog₂n)로 준수한 시간 복잡도를 갖지만 최악의 경우 O(n²)가 나온다. 때문에 두개의 피봇을 두고 퀵 정렬을 한다. 그렇기에 그 기본이 되는 퀵 정렬에 대해 공부해 보았다. 퀵정렬의 정렬 방식 피벗을 기준으로 피벗보다 작은 요소들은 피벗의 왼쪽에 위치시..

Querydsl 서브쿼리

Querydsl에서 서브쿼리 사용 시 새로운 Q타입의 객체를 생성하여 중첩되지 않도록 사용하여야 한다. 1. Where 절에 서브쿼리 사용 예 1 /** * 나이가 가장 많은 회원 */ @Test public void subQuery() throws Exception { QMember sub = new QMember("memberSub");// 서브쿼리 Q타입 객체 생성 //when List result = queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(sub.age.max()) .from(sub))) //fetch는 하지 않는다 .fetch(); //then assertThat(result).extracting..

JPA 2024.03.31

Docker + Jenkins + Ec2 + Springboot 배포 실습

젠킨스 설치 및 실행 1. Docker를 통해 Jenkins 이미지를 Pull 받는다. 2. Jenkins를 실행한다. docker run -d -p 9090:8080 --name jenkins jenkins/jenkins 실행 확인 docker ps /// CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 62812e730590 jenkins/jenkins:lts "/usr/bin/tini -- /u…" 2 days ago Up 9 seconds 50000/tcp, 0.0.0.0:9090->8080/tcp jenkins 실행시킨 포트로 접근하면 아래와 같이 password를 입력하라고 한다. 터미널을 통하여 Docker의 shell을 실행시키거나 docke..

Docker 2024.03.30

Querydsl 정리

기존에 활용해 보았던 Querydsl에 대하여 추가적으로 알게 된 기능들을 정리해 본다. Dto를 Q타입으로 사용하는 방법(@QuertProjection) @Data public class MemberTeamDto { private Long memberId; private String username; private int age; private Long teamId; private String teamName; @QueryProjection public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) { this.memberId = memberId; this.username = username; th..

JPA 2024.03.29

리눅스의 역사

유닉스(Unix)의 탄생 유닉스는 자료와 정보의 공유를 위한 목적으로 다중 사용자와 멀티 태스킹 기능을 수행할 수 있도록 1969년 미국의 켄 톰슨 (Ken Tompson)에 의해 개발되었다. Unix는 어셈블리 언어(특정 기종에서만 사용 가능한 언어)로 이루어졌기 때문에 다른 기종의 컴퓨터에서는 해당 컴퓨터의 어셈블리 언어를 이용해 운영체제를 다시 작성했어야 했다. 이런 기종간 호환을 만족시키고 프로그래밍 작업의 통일성과 효율성을 위해 어셈블리 언어가 아닌 새로운 방식의 프로그래밍 언어를 고안해 냈습니다. 이 새로운 언어는 CPU와 직접 연결되는 것이 아니라 간접적인 방식으로 작성된 소스 코드를 특정 기종에 최적화시켜 거쳐 실행 코드를 만드는 설계 구조를 가지고 있습니다. 이 언어를 통해 다른 기종의 ..

OS 2024.03.23

운영체제의 종류와 리눅스의 계열

운영체제 종류 1. 유닉스 (Unix) 운영체제의 시초이다. 윈도우를 제외한 모든 운영체제가 유닉스 계열 유닉스의 대부분은 C언어로 만들어져 있다. 2. 윈도우 (Windows) 유닉스 계열이 아니다 보니 운영체제가 달라 프로그래밍 언어의 라이브러리를 지원하지 않는 경우가 있다거나 따로 만들어야 하는 경우도 있다. AI와 같이 빠르게 변화하는 업계에는 위와 같은 특징으로 불편한 점이 많다고 한다. 이러한 단점을 보완하기 위해 윈도우 내부에 리눅스 계열의 OS를 설치할 수 있도록 WSL을 지원한다. 3. 맥OS(MacOS) 애플 계열 전용 OS 유닉스 계열의 운영체제로 개발에 사용되는 서버와 호완성이 좋다. 4. 리눅스(Linux) 모바일 운영체제(안드로이드 , iOS)는 리눅스 커널 기반으로 만들어져 있..

OS 2024.03.23

OS의 정의와 발전 과정

교육 코스 중에 발표에 걸려 OS의 정의와 리눅스에 대한 역사를 발표하게 되었다. 발표하면서 정리한 내용을 적어본다. 1. 운영 체제(Operating System)란? 운영체제는 하드웨어를 관리하기 위한 프로그램 하드웨어를 관리한다 : 주어진 하드웨어 자원이 소프트웨어 자원을 효율적으로 관리함으로써 사용자가 시스템을 편하게 이용하도록 하는 소프트웨어(OS 도 소프트웨어의 일종이다.) 운영체제의 기능 프로세서, 기억장치, 입출력 장치, 파일 및 정보 등 관리 자원을 효율적으로 관리하기 위해 스케줄링 기능 제공 하드웨어와 네트워크 관리 및 제어 데이터 관리 및 자원 공유 기능 입출력 보조 기능 제공 시스템 검사 및 복구 운영체제의 목적 처리 능력 : 일정 시간 동안 수행되는 처리의 양 응답 시간 : 작업이..

OS 2024.03.21

JPA , QueryDsl 수정 중 에러 해결

동적 쿼리에 대한 기능을 수정이 필요하여 JPA와 QueryDsl의 코드를 일부 수정했다. 수정하던 중 발생한 Exception들을 정리하여 보았다. @Query 메서드를 통해 작성되어 있던 코드에서 에러가 발생하였다. JPQL 코드 @Query(value = "select " + "d " + "from Deposit d " + "join ProjectMember pm on d.projectMember = pm " + "join Member m on pm.member = m " + "join User u on m.user = u " + "join Project p on pm.project = p " + "where d.status in (:statusList) " + "and d.createdDate >..

JPA 2024.03.17

Security CORS 설정

사이드 프로젝트를 진행 중 프론트 담당자로부터 CORS를 열어달라는 요청이 들어왔다. 1. CORS(Cross Origin Resource Sharing) - Origin 의 위치가 다를 때 자원을 주고받을 수 있도록 하는 http 통신 프로토콜. - 프로토콜(https)+호스트(ip주소)+포트번호(8080) 의 조합 - 클라이언트와 서버의 Origin 이 다를 때 CSRF와 XSS 등에 취약하다 때문에 / 특정 경로 / http 메서드 / 특정 해더 / 포트 에 대해 접근을 허용할 수 있다. 2. CORS 설정 방법 CORS를 허용하는 방법에는 크게 두 가지가 있다. 1. CorsFilter를 구현하여 Spring Security에서 관리하는 방법2. SpringFramwark 가 제공하는 MVC 기능..

Spring 2024.03.17