분류 전체보기

    상속보다 컴포지션을 사용해야하는 이유

    [Java] 컴포지션(Composition) 컴포지션 : 기존 클래스가 새로운 클래스의 구성요소가 되는 것 상속(Inheritance)의 단점을 커버할 수 있는 컴포지션에 대해 알아보자 우선 상속(Inheritance)이란, 하위 클래스가 상위 클래스의 특성을 재정의 한 것을 말한다. 부모 클래스의 메서드를 오버라이딩하여 자식에 맞게 재사용하는 등, 상당히 많이 쓰이는 개념이면서 활용도도 높다. 하지만 장점만 존재하는 것은 아니다. 상속을 제대로 사용하지 않으면 유연성을 해칠 수 있다. 구현 상속(클래스→클래스)의 단점 1) 캡슐화를 위반 2) 유연하지 못한 설계 3) 다중상속 불가능 오류의 예시 다음은, HashSet에 요소를 몇 번 삽입했는지 count 변수로 체크하여 출력하는 예제다. public ..

    시스템 규모 확장

    시스템 규모 확장 시스템 사용자 수에 따라 설계해야 하는 규모가 달라진다. 수백만의 이용자가 존재하는 시스템을 개발해야 한다면, 어떤 것들을 고려해야 할 지 알아보자 무상태(stateless) 웹 계층 수평적으로 확장하기 위해 필요하다. 즉, 사용자 세션 정보와 같은 상태 정보를 데이터베이스와 같은 지속 가능한 저장소에 맡기고, 웹 계층에서는 필요할 때 가져다 사용하는 방식으로 만든다. 웹 계층에서는 무상태를 유지하면서, 어떤 사용자가 http 요청을 하더라도 따로 분리한 공유 저장소에서 해당 데이터를 불러올 수 있도록 구성한다. 수평적 확장은 여러 서버를 추가하여 Scale out하는 방식으로, 이처럼 웹 계층에서 상태를 지니고 있지 않으면, 트래픽이 늘어날 때 원활하게 서버를 추가할 수 있게 된다. ..

    Github Sponsor 등록

    HTML 삽입 미리보기할 수 없는 소스 깃헙 스폰서 등록 완료!!

    [Spring Boot] CORS 설정 시 addCorsMappings 관련 에러

    CORS 설정 시 addCorsMappings 관련 에러 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*"since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead. 스프링 부트에서 CORS 설정 시, .allowCredentials(true)와 .allowedOr..

    [JPA] Infinite Recursion

    JPA Infinite Recursion JPA를 활용하여 양방향 매핑을 선언했을 때 아래와 같은 에러가 발생할 수 있다. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion 컨트롤러에서 JSON 형태로 값을 출력할 때, 타입 변환이 필요하다. 이때 변환해야하는 엔티티의 필드가 다른 엔티티와 매핑 관계로 연결되어있다면 참조를 진행한다. 그리고, 이 연결된 엔티티에서도 함께 연결된 기존의 ..

    Lombok 사용 시 주의할 점

    @Data 사용 지양 해당 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 모두 갖춘 강력한 어노테이션임 무분별한 사용은 오히려 부작용을 가져올 수 있음(Setter 남용 금지 등) 순환 참조 대비 두 객체가 양방향 연관관계 일때, toString()을 호출하면 무한 순환 참조의 문제가 발생한다. 따라서 @ToString 어노테이션을 통해 제외시켜줘야 한다. @ToString(exclude = "대상객체") @NoArgsConstructor 접근 권한 최소화 기본 생성자를 만들 때는 접근 권한을 protected로 설정한다. @NoArgsConstructor(access = AccessLevel.PROTEC..

    TLS/SSL HandShake

    TLS/SSL HandShake HTTPS에서 클라이언트와 서버간 통신 전 SSL 인증서로 신뢰성 여부를 판단하기 위해 연결하는 방식 진행 순서 클라이언트는 서버에게 client hello 메시지를 담아 서버로 보낸다. 이때 암호화된 정보를 함께 담는데, 버전, 암호 알고리즘, 압축 방식 등을 담는다. 서버는 클라이언트가 보낸 암호 알고리즘과 압축 방식을 받고, 세션 ID와 CA 공개 인증서를 server hello 메시지와 함께 담아 응답한다. 이 CA 인증서에는 앞으로 통신 이후 사용할 대칭키가 생성되기 전, 클라이언트에서 handshake 과정 속 암호화에 사용할 공개키를 담고 있다. 클라이언트 측은 서버에서 보낸 CA 인증서에 대해 유효한 지 CA 목록에서 확인하는 과정을 진행한다. CA 인증서에..

    [Travis CI] 프로젝트 Travis CI 연동하기

    프로젝트 Travis CI 연동하기 자동으로 테스트 및 빌드가 될 수 있는 환경을 만들어 개발에만 집중할 수 있도록 하자 CI(Continuous Integration) 코드 버전 관리를 하는 Git과 같은 시스템에 PUSH가 되면 자동으로 빌드 및 테스트가 수행되어 안정적인 배포 파일을 만드는 과정을 말한다. CD(Continuous Deployment) 빌드한 결과를 자동으로 운영 서버에 무중단 배포하는 과정을 말한다. Travis CI 웹 서비스 설정하기 Travis 사이트로 접속하여 깃허브 계정으로 로그인 후, Settings로 들어간다. Repository 활성화를 통해 CI 연결을 할 프로젝트로 이동한다. 프로젝트 설정하기 세부설정을 하려면 yml파일로 진행해야 한다. 프로젝트에서 build...

    [AWS] 스프링 부트 배포 스크립트 생성

    [AWS] 스프링 부트 배포 스크립트 생성 AWS에서 프로젝트를 배포하는 과정은 프로젝트가 수정할 때마다 똑같은 일을 반복해야한다. 프로젝트 배포 과정 git pull로 프로젝트 업데이트 gradle 프로젝트 빌드 ec2 인스턴스 서버에서 프로젝트 실행 및 배포 이를 자동화 시킬 수 있다면 편리할 것이다. 따라서 배포에 필요한 쉘 스크립트를 생성해보자. deploy.sh 파일을 ec2 상에서 생성하여 아래와 같이 작성한다. #!/bin/bash REPOSITORY=/home/ec2-user/app/{clone한 프로젝트 저장한 경로} PROJECT_NAME={프로젝트명} cd $REPOSITORY/$PROJECT_NAME/ echo "> Git Pull" git pull echo "> 프로젝트 Build..

    [AWS] EC2 인스턴스 메모리 초과 문제

    Error명 : OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eaaa0000, 178978816, 0) failed; error='Not enough space' (errno=12) EC2 인스턴스에서 스프링 부트 gradle 프로젝트를 clone 후, /gradlew test를 진행했을 때 에러가 발생할 수 있다. OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f4eb92b0000, 262144, 0) failed; error='Not enough space' (errno=12) # # There is insufficient memory for the Jav..

    [AWS] EC2 인스턴스 초기 설정

    [AWS] EC2 인스턴스 초기 설정 아마존 리눅스 인스턴스를 생성 완료했다면, ec2 접속 후 몇 가지 초기 설정을 하자 Java 8 설치 자바가 설치 되어있는지 먼저 확인해보자 java -version 자바 7이 설치되어있을 수도, 아무 설치가 안되어있을 수도 있다. 우선 둘다 상관없이 자바 8을 설치한다. sudo yum install -y java-1.8.0-openjdk-devel.x86_64 자바 설치가 안되어있었으면 완료가 되었고, 만약 자바 7이 기존에 설치되어있었다면 버전 변경 과정이 필요하다. sudo /usr/sbin/alternatives --config java 다음 명령어를 실행 시, 두 가지 버전을 선택할 수 있는 창이 뜰 것이다. 여기서 jre-1.8.0버전에 해당하는 번호를..

    [IntelliJ] JUnit Test 메소드 명 한글 깨짐 해결

    테스트를 수행하다가 메소드명이 깨져서 나오는 경우가 있다. 기본적인 인코딩 설정 (설치 폴더 경로의 .vmoptions 수정, settings의 File Encodings)을 다 완료해도 메소드명은 그대로 깨져있을 수 있다. 기본 인코딩 설정에 관련하여 설명되어있는 블로그 링크 위의 방법으로 웬만해서는 해결이 될 것이다. 하지만 아직도 한글이 깨져있다면 아래 방법을 적용하면 해결된다. 방법은 인텔리제이의 도구창에서 Help → Edit Custom VM Options에 들어간다. 위에 나온 기본 인코딩 설정에서 설치 폴더의 idea64.exe.vmoptions를 수정했지만, 현재 프로젝트 폴더 자체가 사용자\AppData\Roaming에 있는 JetBrain으로 잡혀있어 수정된 파일이 적용이 되지 않은 ..

    [Git] .gitignore이 제대로 작동하지 않는 경우

    프로젝트를 Git에 올릴 때, 불필요한 정보(.idea, .gradle, build/ 등)나 보안이 필요한 파일들은 .gitignore에 정리한다. 하지만 분명히 작성을 했는데도, git add . 후 git status를 확인했을 때 change 파일 명단에 올라가있는 경우가 있다. 이때는 캐시(cache)에 문제가 있는 것이므로, 캐시를 삭제한 뒤 다시 진행해야 한다. git rm -r --cached . git add . git commit -m "fixed project"

    [Spring Data JPA] 더티 체킹 (Dirty Checking)

    [Spring Data JPA] 더티 체킹 (Dirty Checking) 트랜잭션 안에서 Entity의 변경이 일어났을 때 변경한 내용을 자동으로 DB에 반영하는 것 ORM 구현체 개발 시 더티 체킹이라는 말을 자주 볼 수 있다. 더티 체킹이 어떤 것을 뜻하는 지 간단히 살펴보자. JPA로 개발하는 경우 구현한 한 가지 기능을 예로 들어보자 ex) 주문 취소 기능 @Transactional public void cancelOrder(Long orderId) { //주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } orderId를 통해 주문을 취소하는 메소드다. 데이터베이스에 반영하기 위해선, update와..

    다익스트라(Dijkstra) 알고리즘

    다익스트라(Dijkstra) 알고리즘 DP를 활용한 최단 경로 탐색 알고리즘 다익스트라 알고리즘은 특정한 정점에서 다른 모든 정점으로 가는 최단 경로를 기록한다. 여기서 DP가 적용되는 이유는, 굳이 한 번 최단 거리를 구한 곳은 다시 구할 필요가 없기 때문이다. 이를 활용해 정점에서 정점까지 간선을 따라 이동할 때 최단 거리를 효율적으로 구할 수 있다. 다익스트라를 구현하기 위해 두 가지를 저장해야 한다. 해당 정점까지의 최단 거리를 저장 정점을 방문했는 지 저장 시작 정점으로부터 정점들의 최단 거리를 저장하는 배열과, 방문 여부를 저장하는 것이다. 다익스트라의 알고리즘 순서는 아래와 같다. 최단 거리 값은 무한대 값으로 초기화한다. for(int i = 1; i

    [Spring Boot] Test Code

    [Spring Boot] Test Code 테스트 코드를 작성해야 하는 이유 개발단계 초기에 문제를 발견할 수 있음 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 시 기존 기능이 잘 작동하는 지 확인 가능함 기능에 대한 불확실성 감소 개발 코드 이외에 테스트 코드를 작성하는 일은 개발 시간이 늘어날 것이라고 생각할 수 있다. 하지만 내 코드에 오류가 있는 지 검증할 때, 테스트 코드를 작성하지 않고 진행한다면 더 시간 소모가 클 것이다. 1. 코드를 작성한 뒤 프로그램을 실행하여 서버를 킨다. 2. API 프로그램(ex. Postman)으로 HTTP 요청 후 결과를 Print로 찍어서 확인한다. 3. 결과가 예상과 다르면, 다시 프로그램을 종료한 뒤 코드를 수정하고 반복한다. 위와 같은 방식이 얼마나..

    [Spring Boot] SpringApplication

    스프링 부트로 프로젝트를 실행할 때 Application 클래스를 만든다. 클래스명은 개발자가 프로젝트에 맞게 설정할 수 있지만, 큰 틀은 아래와 같다. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @SpringBootApplication 어노테이션을 통해 스프링 Bean을 읽어와 자동으로 생성해준다. 이 어노테이션이 있는 파일 위치부터 설정들을 읽어가므로, 반드시 프로젝트의 최상단에 만들어야 한다. SpringApplication.run()으로 해당 클래스를 run하면, 내장 WAS를 실행한다...

    Blocking/Non-blocking & Synchronous/Asynchronous

    Blocking/Non-blocking & Synchronous/Asynchronous 동기/비동기는 우리가 일상 생활에서 많이 들을 수 있는 말이다. Blocking과 Synchronous, 그리고 Non-blocking과 Asysnchronous를 서로 같은 개념이라고 착각하기 쉽다. 각자 어떤 의미를 가지는지 간단하게 살펴보자 homoefficio님 블로그에 나온 2대2 매트릭스로 잘 정리된 사진이다. 이 사진만 보고 모두 이해가 된다면, 차이점에 대해 잘 알고 있는 것이다. Blocking/Non-blocking 블럭/논블럭은 간단히 말해서 호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이라고 볼 수 있다. 함수 A, B가 있고, A 안에서 B를 호출했다고 가정해보자. 이때 호출한 함수..

    [Spring] MVC Framework

    Spring MVC Framework 스프링 MVC 프레임워크가 동작하는 원리를 이해하고 있어야 한다 클라이언트가 서버에게 url을 통해 요청할 때 일어나는 스프링 프레임워크의 동작을 그림으로 표현한 것이다. MVC 진행 과정 클라이언트가 url을 요청하면, 웹 브라우저에서 스프링으로 request가 보내진다. Dispatcher Servlet이 request를 받으면, Handler Mapping을 통해 해당 url을 담당하는 Controller를 탐색 후 찾아낸다. 찾아낸 Controller로 request를 보내주고, 보내주기 위해 필요한 Model을 구성한다. Model에서는 페이지 처리에 필요한 정보들을 Database에 접근하여 쿼리문을 통해 가져온다. 데이터를 통해 얻은 Model 정보를 C..

    [Java] 직렬화(Serialization)

    [Java] 직렬화(Serialization) 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술 각자 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 갖기 때문에, Reference Type의 데이터들은 인스턴스를 전달 할 수 없다. 따라서, 이런 문제를 해결하기 위해선 주소값이 아닌 Byte 형태로 직렬화된 객체 데이터를 전달해야 한다. 직렬화된 데이터들은 모두 Primitive Type(기본형)이 되고, 이는 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 된다. 따라서, 전송 및 저장이 가능한 데이터로 만들어주는 것이 바로 '직렬화(Serialization)'이라고 말할 수 있다. 직렬화 조..

    Jmeter를 활용한 서버 부하 테스트

    Jmeter는 Apache에서 재공하는 웹사이트 성능 측정을 할 수 있는 오픈소스 라이브러리다. [다운로드 링크] Apache JMeter - Download Apache JMeter Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava jmeter.apache.org 만약 자바가 설치되어 있지 않다면, ..

    [스프링 부트] windows & linux에서 파일 절대 경로 맞추기

    로컬 pc로 스프링 부트 프로젝트를 작업하다가, aws ec2로 배포하게 되면 운영중인 rds나 데이터베이스에 대한 세부정보를 외부로부터 숨겨야한다. (비밀번호 등등) 다양한 방법이 있겠지만, 나는 내 로컬 pc와 linux의 절대 경로를 활용했다. 나는 rds와 mariadb 정보가 담겨있는 yml 파일을 따로 로컬과 linux app 폴더에 저장한 뒤, 스프링 부트의 application.java에서 조건문으로 나눠줬다. 자바에서는 'os.name'에 대한 프로퍼티를 시스템에서 얻으면 내가 어떤 운영체제를 활용하고 있는지 값을 받아올 수 있다. String os = System.getProperty("os.name").toLowerCase(); 만약 로컬(윈도우)라면 os에는 "win"이 저장된다. ..

    [Git] default 브랜치는 master에서 main으로 변경되었음

    현재 많은 Git 명령어 정보들이 'master' 브랜치를 이용하고 있다. 하지만 최근 프로젝트 생성 시 기본 브랜치가 'main'으로 변경되면서 혼동되는 경우들이 존재한다. "There isn't anything to compare. Nothing to compare, branches are entirely different commit histories" master로 push를 하면 커밋 결과가 제대로 적용되지 않고, main 브랜치와 Compare하는 창이 나온다. 기본 default 브랜치가 main이기 때문에, master로 push를 해도 아직 적용 단계가 안되었기 때문이다. 현재 많은 튜토리얼 들이 master 브랜치가 default인 기준으로 작성되어서 제대로 push가 되지 않는 상황이..

    Spring Boot 동작 환경

    1. 웹 브라우저에서 url(localhost:8080/hello)을 보낸다. 2. url을 받은 내장 톰켓 서버는 맵핑되는 컨트롤러에게 넘겨준다 (→ helloController) 3. 맵핑된 컨트롤러에서 model에 데이터를 담아 return해준다. 4. 컨트롤러가 return으로 반환해주는 model을 viewResolver가 템플릿을 찾아서 뿌려준다. 5. 변환된 html을 다시 웹 브라우저에게 제공해준다. 출처 : 링크 [무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확..

    [Algorithm] 카페 주문처리 시스템

    손님이 주문한 음료를 우선순위에 맞춰서 저장하여 처리하는 문제 (보안상 링크 및 자세한 설명 생략) 커피 종류는 최대 50개, 서로 다른 난이도를 가짐 하루에 최대 10,000명 손님이 한 명당 최대 10개 주문 가능 (커피 종류 중복 가능) 손님 번호는 1 ~ 100,000 커피 별로 주문 처리 시 우선순위 : 손님 주문 中 가장 높은 난이도 + 주문시각 오름차순 (같으면 주문 시각 오름차순) 주문 최대 호출 1만, 커피 만듬 호출 10만, 취소 호출 1만, 수량 체크 1만 함수 void init( ... ) : 음료 난이도 초기화 void order( ... ) : 손님이 주문한 음료 전송 (시간 포함) int supply(int kind) : kind 음료에서 가장 우선순위 높은 것 제조 (해당 손..

    [Git] Logon failed, use ctrl+c to cancel basic credential prompt

    git으로 push를 할 때 다음과 같은 문구가 뜨면서 로그인을 하라고 창이 뜬다. 어떤 문제인지 찾아보니, Git의 최신 업데이트가 있어서 발생한 이슈였다. bash 창에 `git update-git-for-windows`를 입력하고, 새로운 버전으로 업데이트를 시키면 해결이 가능하다.

    [VSCODE PowerShell] Execution_Policies 문제 해결

    쉘 스크립트에서 정책문제로 명령어 실행이 안되는 경우가 있다. 이 시스템에서 스크립트를 실행할 수 없으므로 ... 스크립트 실행 권한이 제한되어 있기 때문에 발생하는 문제다. 해결 Windows PowerShell을 관리자 모드로 실행 get-help Set-ExecutionPolicy 입력 ExecutionPolicy에 대한 정책을 RemoteSigned로 수정해줘야 한다. Set-ExecutionPolicy RemoteSigned 이제 정상적으로 설치가 진행된다.

    삼성 소프트웨어 역량테스트 PRO등급 준비

    SAMSUNG Software PRO등급 준비 역량 테스트 단계 Advanced Professional Expert 시험 시간 및 문제 수 : 4시간 1문제 Professional 단계부터는 라이브러리를 사용할 수 없다. C/Cpp 경우, 동적할당 라이브러리인 malloc.h까지만 허용 또한 전체적인 로직은 구현이 되어있는 상태이며, 사용자가 필수적으로 구현해야 할 메소드 부분이 빈칸으로 제공된다. (main.cpp와 user.cpp가 주어지며, 우리는 user.cpp를 구현하면 된다) 크게 두 가지 유형으로 출제되고 있다. 실행 시간을 최대한 감소시켜 문제를 해결하라 쿼리 함수를 최소한 실행시켜 문제를 해결하라 결국, 최대한 효율적인 코드를 작성하여 시간, 메모리를 절약하는 것이 Professinal ..

    신입 개발자를 위한 웹사이트를 만들었습니다.

    취업 준비를 하면서 정리했던 컴퓨터 공학 '전공 지식'과 '기술 면접'에 관련된 학습 내용들을 편하게 볼 수 있도록 웹사이트로 만들었습니다. 기존의 Github Repository에서 md파일로 정리해오던 자료들을, Vuepress 테마를 활용하여 GitHub 블로그로 만들고 개인 커스텀 도메인을 연결 완료했습니다. 게시글을 하나하나 작성하지 않고도, 바로 docs 폴더 안에 md파일을 넣어두면 게시글에 markdown 형식이 적용되어 나오기 때문에 UI적으로도 깔끔한 구성이 나와 vuepress를 선택하게 되었습니다. 티스토리와 같이 Gyoogle이라는 이름으로 정했으며, 개발자들이 많이 이용하는 dev로 도메인을 구매했습니다. [링크] Gyoogle gyoogle.dev 개발자의 길을 꿈꾸거나, 취업..

    [알고리즘] 비트마스크(BitMask)

    비트마스크(BitMask) - 집합의 요소들의 구성 여부를 표현할 때 유용한 테크닉 왜 비트마스크를 사용하는가? - DP나 순열 등, 배열 활용만으로 해결할 수 없는 문제 - 작은 메모리와 빠른 수행시간으로 해결이 가능 (But, 원소의 수가 많지 않아야 함) - 집합을 배열의 인덱스로 표현할 수 있음 - 코드가 간결해짐 비트(Bit)란? 컴퓨터에서 사용되는 데이터의 최소 단위 (0과 1) 2진법을 생각하면 편하다. 우리가 흔히 사용하는 10진수를 2진수로 바꾸면? 9(10진수) → 1001(2진수) 비트마스킹 활용해보기 - 0과 1로, flag 활용하기 [1, 2, 3, 4 ,5] 라는 집합이 있다고 가정해보자. 여기서 임의로 몇 개를 골라 뽑아서 확인을 해야하는 상황이 주어졌다. (즉, 부분집합을 의..