전체 글

전체 글

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

    [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..