전체 글

개발하면서 공부한 내용들을 정리하는 곳입니다
JAVA

[Java] Access Level 에 관하여

Access Level 을 protected 로 설정하는데 왜 protected 로 설정하는지 protected 로 설정했을 때의 접근 영역이 어딘지 헷갈려 정리를 해보려한다. Access Level 의 필요성 접근 레벨을 가장 흔하게 적용하는 예는 아래와 같이 기본생성자를 만들 때이다. 보안상의 문제로 public 을 쓰지 않는다면 왜 private 을 사용하지 않는가에 대한 의문을 하지 못했던 것 같다. @NoArgsConstructor(access = AccessLevel.PROTECTED) // ★ 접근 레벨 설정 public class Member { .. } 우선, public 이 아닌 이유는 외부에서의 무분별한 생성을 막기위해서이고 private 이 아닌 이유는 JPA의 프록시 객체를 생성해..

Web

[Spring] CORS Configuration with Spring security

이전에 했던 프로젝트에서 작성했던 코드를 보고 제대로 정리하지 않았던 것 중 CORS 가 있었다. CORS ( Cross-Origin Resource Sharing ) 란? 서로 다른 도메인 간 통신을 할 때, 서로 다른 출처를 가지고있기 때문에 보안적인 측면에서 통신이 허용되지 않는다. 통신을 위해서는, 요청 헤더 Origin 필드에 요청 출처를 함께 담아 교차 출처 HTTP 요청을 실행해야 한다. 출처를 비교하는 로직은 서버에 구현된 스펙이 아닌 브라우저에 구현된 스펙 기준으로 처리되며 브라우저는 클라이언트의 요청 헤더와 서버의 응답 헤더를 비교해서 최종 응답을 결정한다. 두 개의 출처를 비교하는 방법은 URL 의 구성 요소 중 Protocol, Host, Port 이 세 가지가 동일한 지만 확인한다..

Web

[Spring] 동시성 이슈와 synchronized 에 관하여

재고 관리 로직을 통해 동시성 이슈에 대해서 정리해보자. 공유 자원과 임계 영역(Critical Section) 그리고 Race Condition 먼저, 스레드의 공유 자원에 대해 생각해보자. 스레드가 여럿일 경우 스레드는 힙 영역에 있는 모든 데이터를 공유한다. 힙에는 모든 객체와 객체의 속한 필드들이 저장되며 스레드에서 접근이 가능하다. 그렇다면 임계 영역(Critical Section)은 무엇일까 ? 이는, 공유 자원에 액세스하고 이에 대한 쓰기 작업을 수행하는 코드 세그먼트를 말한다. 예시는 아래와 같다. Item 클래스와 해당 클레스의 멤버 변수들은 힙에 할당된 공유 자원으로 모든 스레드에서 접근이 가능하고, 공유 자원의 값을 변경하는 코드 세그먼트를 보여준다. 마지막으로, Race Condit..

Web

[JPA] Dirty Checking 동작 방식 및 성능 개선

JPA 를 다시 공부하다가 변경감지를 내가 잘 이해하지 못했던 것 같아 정리해본다. Dirty Checking 동작 방식 JPA 의 영속성컨텍스트(Entitymanger)에는 1차 캐시와 쓰기 지연 SQL 저장소가 존재한다. 1차 캐시에는 id와 entity가 저장되고 쓰기 지연 저장소에는 쿼리가 쌓이는데 commit 하는 시점에 DB에 반영이 된다. 해서, 1차 캐시에 저장되어있는 엔티티를 수정하면 Dirty Checking(변경 감지) 으로 인해 쓰기 지연 저장소에 update 쿼리가 쌓이고 Transaction 이 끝나는 시점에 DB에 반영이 된다. 자바 코드로 commit이나 flush를 통해 커밋하는 게 아닌 테스트 시나리오 상에서 update 쿼리가 언제 호출되는지 보고싶어서 테스트 코드를 작..

Web

[Spring] Maven Scope 와 Gradle Configurations

project 를 하며 dependency scope 가 다른 것을 보고 한 번 정리해야겠다고 생각했다. gradle configurations 와 maven scope 를 각각 살펴보자. 종속성 관리 종속성 관리는 프로젝트를 할 때 필요에 따라 외부 라이브러리나 프레임워크를 사용하는데 Maven 혹은 Gradle 과 같은 빌드 도구가 이를 관리해주는 것을 말한다. 또한, 이를 빌드 수명 주기의 적절한 시점에 클래스 경로에 추가하는데 이 시점에 대한 정리를 해보려한다. Maven 은 pom.xml 에서, Gradle 은 build.gradle 에서 관리하며 예시는 아래와 같다. - Maven scope : runtime com.mysql mysql-connector-j runtime - Gradle Co..

JAVA

[Java] stream.map() 동작 및 예제

자바 8 이상부터 가능한 Stream 기능 중, map 에 대한 내용이다. map() 동작 및 예제 1. .stream().map(Function

DevOps

[Git] Git Flow 와 GitHub Flow, branch 전략에 대해서

토이 프로젝트를 시작하기 전에, branch 전략을 어찌할 지 고민하다가 정리를 해보기로 했다. Git과 Github 1. Git과 Github 먼저, Git과 Github 를 혼용하여 썼던 적이 많아 용어 정리를 해보았다. Git 은 2005년 Linus Torvalds가 만든 특정 오픈 소스 Version Control 시스템으로, 각 개발자에게 로컬에서 코드 변경의 전체 기록을 제공하는 분산 개발을 지원한다. 대부분의 Git 작업에는 로컬 파일과 리소스만 필요하며 일반적으로 네트워크의 다른 컴퓨터 정보가 필요없다. 또한, 개발자가 서로 다른 branch에서 동시에 작업하고 코드를 병합할 수 있게 한다. Github 는 웹 기반 Git 리포지토리 호스팅 서비스로, 자체 기능을 추가할 뿐만 아니라 Gi..

Web

[Spring] compiletime 과 runtime 에 대해서

프로그램을 돌렸을 때 RuntimeError 가 발생하여 꺼지는 등, compile과 runtime 이 자주쓰이는 용어임에도 개념이 정리되어있지 않은 것 같아 이번에 정리해보려한다. Runtime 과 CompileTime Java 와 같은 고급 언어로 작성된 명령이나 소스 코드는 컴퓨터가 이해할 수 있도록 기계어로 변환되어야 한다. Compile Time 은 소스 코드가 컴파일러에 의해 기계어로 변환되는 시간으로 소스 코드는 .java에서 .class로의 바이트 코드로 변환된다. 이 시간 동안에 컴파일러가 코드의 구문 등을 확인한다. Runtime 은 프로그램이 실행되는 기간이며 일반적으로 컴파일 시간 이후에 발생한다. CompileTime Error Java를 기준으로 Java의 문법에 맞지 않게 작성..

limnj
개발을 하자