서버개발

    Netty와 Spring Webflux

    Netty란비동기 이벤트 기반 네트워크 응용프로그램 프레임워크이다. 단순히 네트워크 통신과 관련된 기능 뿐만이 아니라 여러 네트워크 어플리케이션에서의 기능도 제공하고 있어 서버 개발자들이 자신의 비즈니스 로직에 더 집중할 수 있도록 할 수 있다. Netty 프레임워크의 특징비동기 입출력 Netty 프레임워크는 비동기 처리를 지향한다. 요청을 보낸 뒤 즉시 반환한 다음 다른 작업을 하다 요청한 작업의 처리가 완료되면 나중에 응답 받는 방식이다. 보낸 요청의 응답이 올 때까지 기다리는 동기와 상반된 방식 Blocking & Non Blocking Socketread, write, accept 등의 메서드가 호출되면 완료될 떄까지 쓰레드가 멈추는 블로킹 방식과 하나의 스레드로 여러 클라이언트를 대응하는 논 블..

    Spring AOP 프록시 패턴

    AOP란 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이다. OOP를 보완하는 것으로 여러 곳에서 자주 사용되는 공통 기능을 모듈화하여 쓰이는 곳에 필요할 때 연결해 유지보수와 재사용성을 용이하도록 프로그래밍 하는 것 AOP를 적용하는 방법 컴파일 타임 적용 : 컴파일 시점 바이트 코드 조작 로드 타임 적용 : 클래스 로딩 시점 런타임 적용 : 스프링 AOP 채택, Bean을 만들 때 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작하는 방법 스프링 빈이란? Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다. 제어의 역전으로 인해 프레임워크가 객체를 주입을 맡게 되면서, 주입할 객체를 관리해야하는데 이를 빈이..

    TCP/IP Socket vs RESTful API vs gRPC vs WebSocket

    들어가면서 서버에서 클라이언트 혹은 다른 서버와 통신하는 방법으로 여러가지가 있지만 그 중에서 TCP 상에서 IPC를 위해 자주 사용되는 TCP/IP Socket, RESTful API, gRPC, WebSocket의 차이를 공부하고자 한다 프로세스는 기본적으로 상호독립적으로 가동되기 때문에 서로 메모리를 공유하지 않고, 서로 간섭하지 않는다. 그렇기 때문에 프로세스간의 정보교환이 이루어져야 할 때의 방법 중 하나가 IPC이다. 서버는 각 클라이언트와 일대일 혹은 일대다의 관계를 가지며 일대일의 경우 Request/Response, Notification이 통신에 사용되며, 일대다의 경우 Publish/Subscribe 구조를 가지게 된다. (다른 경우도 있지 않을까?) TCP/IP Socket TCP/..

    벌크 연산과 @Modifying 어노테이션

    요약 JPA를 이용하게 되어도 쿼리를 작성해야하는 순간이 오는데 다중 write 연산인 Bulk 연산과 @Modifying 어노테이션에 대해서 정리하였다. JPA는 영속성 컨텍스트에 오브젝트를 캐싱하는데 이때 @Modifying 설정에 따라 캐싱된 데이터와 DB의 데이터가 일관하지 않을 수 있다. 이를 고려하여 코드를 작성하여야 한다. @Modifying @Query 어노테이션(JPQL Query, Native Query)을 통해 작성된 insert, update, delete 쿼리에서 사용되는 어노테이션 기본적으로 JpaRepository에서 제공하는 메서드 혹은 메서드 네이밍으로 만들어진 쿼리에는 적용되지 않는다 clearAutomatically, flushAutomactically 속성 변경 가능 ..

    비관적 락, 낙관적 락

    Lock이란 DB 충돌 상황을 개선하기 위해 사용하는 것 방법 테이블의 row에 접근 시 lock을 걸고 다른 lock이 걸려 있지 않는 경우에만 수정이 가능하도록 설정 수정할 때 내가 먼저 이 값을 수정했다고 명시하여 다른 사람이 동일한 조건으로 값을 수정할 수 없게 하는 것 낙관적 락(Optimistic Lock) 이론 수정할 때 내가 이 값을 수정했다고 명시하여 다른 사람이 동일한 조건으로 값을 수정할 수 없게 하는 것 (주로 versioning) DB에서 제공하는 것이 아닌 어플리케이션 레벨에서 잡아주는 Lock 애시당초 버전을 동시에 select query에 사용하기 때문에 해당 row가 update된 경우 찾을 수 없음 hashcode와 timestamp를 이용하기도 한다 비관적 락(Pessi..

    Spring protobuf 부분 로딩 오류 해결(GCP Storage Signed Url)

    서버에서 클라이언트로 사진, 음원, 영상을 보내야하는 작업이 있었다. 영상을 서버에 저장해서 클라이언트로 보내는 것은 서버에 큰 부하가 있기 때문에 GCP Storage에 영상을 저장하고 해당 링크를 클라이언트로 보내주기로 했다. Storage를 사용하면 영구히 변하지 않는 PublicUrl을 제공하는 방법과 만료 시간을 정할 수 있는 SignedUrl을 제공하는 방법이 있다. PublicUrl이 주어지면 이를 클라이언트 단에서 탈취해 부적절한 접근을 할 수 있으므로 SignedUrl을 사용하기로 했다. 송신하는 응답 패킷에는 SignedUrl을 사용하는 필드가 3개 있었는데, SignedUrl로 변경하자마자 클라이언트단에서 데이터 중 일부를 받지 못하는 상황이 발생했다. 패킷이라면 일부가 전송이 실패하..

    SpringBoot JUnit5 테스트 및 어노테이션

    SpringBoot의 테스트 종류 @SpringBootTest 실제 어플리케이션을 자신의 로컬 위로 올려서 포트 주소가 Listening 되어지고, DB와 커넥션이 붙어지는 상태로 진행되는 라이브 테스트 방법 Bean 범위 : 주입된 Bean 전체 다른 테스트에 비해 무거운 테스트 @WebMvcTest Controller(API) Layer만을 테스트하기 적합한 테스트 어노테이션으로, 전체 어플리케이션을 실행하는 것이 아닌 Controller만을 로드하여 테스트를 진행할 수 있는 테스트 방법 Bean 범위 : MVC관련 Bean(Controller, Service) @DataJpaTest Jpa DB I/O 테스트 Bean 범위 : JPA 관련 Bean(EntityManager) @RestClientTe..

    Protobuf(Protocol Buffers)와 RPC

    들어가면서 게임에서는 문자열을 모두 원본 형태로 보내는 JSON 방식이 아닌 더욱 적은 대역폭으로 전송을 하는 Protobuf를 사용하기도 한다. 이를 실무에서 사용하기 전에 공부해보고자 Protobuf와 RPC에 대한 글을 정리하였다. RPC 통신 RPC 통신이란 Remote Procedure Call(원격 프로시저 호출)의 준말로, 별도의 원격제어 코드 없이 다른 주소 공간에서 함수/프로시저를 실행하도록 하는 프로세스 간 통신 기술(어디든 동일 호출) 함수 input에 따른 output의 발생 return값을 필요로 하며, 간단한 계산 및 수치 등을 도출할 때 사용 프로시저 output 값에 집중보단, 명령 단위 수행절차에 집중 return은 없을 수도 있고, 서버단에서 함수보다 큰 실행, 프로세싱 ..