프로그래밍

    [Java] 쓰레드의 상태와 제어

    쓰레드 프로세스가 할당받은 자원을 이용하는 실행의 단위 쓰레드의 생성 프로세스가 작업중인 프로그램에서 실행 요청이 들어오면 쓰레드를 만들어 명령을 처리하도록 함 쓰레드의 자원 프로세스 안에는 여러 쓰레드들이 있고, 쓰레드들은 실행을 위한 프로세스 내 주소 공간이나 메모리공간(Heap)을 공유받음 추가로, 쓰레드들은 각각 명령처리를 위한 자신만의 메모리공간(Stack)도 할당 받음 쓰레드 상태 스레드 객체를 생성하고 start() 메소드를 호출하면 바로 실행되는 것이 아니라 실행 대기 상태가 된다. 실행 대기 상태란 언제든지 실행할 준비가 되어 있는 상태를 의미한다. 실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있고, 실행 대기 상태에 있는 다른 스레드가 ..

    [Spring] 스프링(Spring)이란?

    Spring이란? 엔터프라이즈용 Java 애플리케이션을 간편하게 만들게 해주는 도구 스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부를 추가적으로 해야만 했습니다. 비즈니스 로직을 구현하는 기술 자체가 복잡하고 어려웠기 때문입니다. 스프링은 이전 기술에 비해 사용 방법이 상대적으로 덜 복잡합니다. 따라서, 개발 초기에 기본적인 설정과 적용시킬 기술들만 잘 선택을 해준다면, 기술보다는 애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있습니다. 오픈소스 스프링은 모든 사용자에게 무료로 열려 있습니다. 즉, 어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발을 할 수 있으며, 필요하다면 스프링의 코드를 일부 수정하여 사용하여도 무관합니다. 이처럼 오픈..

    [Nginx] SSE 통신할 때, Connection Timeout..

    문제상황 로컬에서 잘 되던 연결이 서버에 배포를 하고 테스트를 하니 클라이언트가 받지를 못하고 Connection Timout이 나는 것이다.. 딱히 특별한 에러로그도 없어서 왜이러나 하고 이것 저것 찾아본 결과 Nginx 쪽에서 문제가 있던 것을 알 수 있었다. 원인 현재 클라이언트와 WAS 사이에는 프록시 서버로 Nginx 웹 서버를 사용하고있는데, Nginx는 기본적으로 Upstream으로 요청을 보낼 때, HTTP/1.0 버전을 사용한다. 연결을 위해서는 Http버전은 1.1 , Connectoin:keep-alive로 통신을 해야한다. 클라이언트에서 백엔드서버로 요청을 할 때에는 맞게 보내지만 Nginx에서 백엔드 WAS 프록시하여 요청을 전달할 때는 HTTP/1.0 버전을 사용하고 Connec..

    [Spring] 유효성 검증 - Validation

    Validation이란? 로직을 처리하기 위해 필요한 데이터 ( 사용자 또는 다른 서버의 request 등 )의 값이 유효한지, 잘못된 데이터인지 확인하는 단계를 뜻합니다. 예를들어 이메일 데이터를 받을 때, 이메일의 형식이 일치하지 않는다면, 처리를 하지 못하기에 사전에 확인하고 검증합니다. Bean Validation Spring에서는 validation을 위해 Bean Validation 라이브러리를 제공합니다. Bean Validation은 유효성 검증에 대한 여러 에노테이션을 제공합니다. @NotNull null 불가 @NotEmpty null, “” 불가 @NotBlank null, “”. “ “ 불가 @Size 문자 길이 측정 @Max 최대값 @Min 최소값 @Positive 양수 @Nega..

    [JPA] 영속성 컨텍스트와 Entity 상태

    ※ 영속성 컨텍스트란? 영속성 컨텍스트는 간단히 말하면 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간입니다. JDBC API와 SQL Mapper를 이용하여 개발자들이 직접 쿼리를 작성해 DB에 데이터를 관리해왔던 시절에서 JPA 를 사용하여 쿼리를 작성하지않고 객체를 활용하여 DB에 데이터를 관리할 수 있게 되었습니다. 이러한 과정을 위해 JPA는 영속성 컨텍스트에 Entity 객체들을 저장하여 관리하며 DB와 소통합니다. EntityManger 영속성 컨텍스트에 접근하여 Entity 객체들을 제어하기 위해서는 EntityManger가 필요합니다. 더보기 EntityManager는 이름 그대로 Entity를 관리하는 관리자의 역할을 합니다. 개발자들은 EntityManger를 사용해서..

    [Spring] REST API 테스트 코드 작성하기

    내일배움캠프 Spring 개인과제 (익명 게시판 API구현하기)를 하면서 TDD 구현 프로세스로 하자고 마음먹고 진행했다. 그래서 기본적인 설계 (유즈케이스, ERD, API 명세)를 작성하였고 컨트롤러 테스트코드 -> 컨트롤러 -> 서비스테스트코드 -> 서비스 , 레포지토리 순서로 구현을 생각해서 가장 먼저 컨트롤러 테스트 코드를 작성해보았다. 컨트롤러 테스트 코드 작성하기 컨트롤러 테스트도 그렇고 각 테스트는 단위 테스트로 작성하였다. 그래서 컨트롤러가 의존하는 컴포넌트(서비스)는 Mokito 프레임워크를 이용해 Mocking하여 진행하였다. @Import(AppConfig.class) //PasswordEncoder Bean 설정 클래스 @WebMvcTest(PostController.class) ..

    [Spring] 테스트 코드에서 JPA metamodel must not be empty! 예외가 발생할 때

    문제상황 게시글 생성 Controller 테스트를 작성하고 테스트를 하려는데 해당 에러를 만나게 됐다. 처음엔 Entity 설정을 뭔가 잘못했나 생각했는데 딱히 이상은 없었고, 잘 모르겠어서 검색을 해보았다. 문제점 에러가 발생한 이유는 Auditing 때문이다. 게시글의 작성일 필드 값을 자동으로 넣어주기 위해 Auditing 설정을 했는데, @EnableJpaAuditing 을 App Class에서 설정을 해주었다. 이렇게 한 설정은 실행할 때는 문제가 되진 않지만, 내가 작성한 테스트에서는 문제가 된다. Spring 컨테이너를 요구하는 테스트는 가장 기본이 되는 @SpringBootApplication이 붙은 클래스가 항상 로딩이된다. @EnableJpaAuditing이 해당 클래스에 등록되어 있어..

    [Spring] spring-data-jpa Auditing 사용하기

    Auditing 테이블을 설계할 때, 공통적으로 들어가는 컬럼이있는데, 바로 생성일자,수정일자,생성자,수정자 이다. 거의 모든 테이블에 들어가있고 정렬, 필터, 또는 검증? 도 할 수 있는 꽤나 중요한 정보들이다. 하지만 서비스를 요청을 하거나 응답을 줄 때, 필요한 정보가 아니기도하다. 서비스에는 영향이없지만 필요하고 중요한? 데이터를 spring-data-jpa 모듈에서 자동으로 넣을 수 있도록 제공을해준다. 해당 기능이 바로 Auditing이다. 사용하기 1. Main App 클래스에 @EnableJpaAuditing 추가하기 @EnableJpaAuditing @SpringBootApplication public class Application { 2. 엔티티 클래스 위에 @EntityListene..