[기타] 개발상식

Updated: Categories:

여러가지 개발 상식 계속 정리하기

POJO

  • Plain Old Java Object
  • Java EE 등의 프레임워크에서 무거운 객체를 만드는 방식을 타파하고자 생긴 용어
  • 특정 기술에 종속되어 동작하는 것이 아닌 순수한 자바 객체
    • 의존성이 높아지고 확장성이 떨어지면 객체지향의 장점을 잃게 된다.
  • Spring에서는 POJO를 지향한다
    • IoC/DI, AOP, PSA등의 기술로 POJO를 지원
    • Spring이 POJO를 유지하면서 Hibernate를 사용할 수 있는 것은 JPA 표준 인터페이스가 있기 때문


VO, DTO, DAO, Entity

VO (Value Object)

  • 수정이 불가능한 읽기 전용 객체

DTO (Data Transfer Object)

  • 계층간 데이터 교환을 위한 객체
  • 로직을 가지고 있지 않는 순수한 데이터 객체

DAO (Data Access Object)

  • 데이터베이스에 접근하기 위한 객체
  • 비즈니스 로직과 데이터베이스 연결 로직을 분리하기 위해 사용함

Entity

  • 데이터베이스의 테이블과 매핑되는 객체
  • 각 계층의 책임을 분리하기 위해 Entity를 DTO 객체로 변환하여 사용함


jar vs war

image

  • 둘다 실행가능한 자바 소스를 압축한 파일임
    • 어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 패키징
  • jar
    • Java ARchive
    • JRE 만으로 실행 가능하다
  • war
    • Web Application aRchive
    • 웹관련 설정 파일까지 포함함
    • 실행하려면 별도의 웹서버가 필요함


Maven vs Gradle

  • 둘다 의존성 관리 툴 / 빌드 도구
  • Maven
    • xml 기반
    • 가독성이 좋지 않다
  • Gradle
    • groovy 기반
    • 가독성이 좋고 동적 빌드가 가능함
    • 캐시를 사용하여 빌드 속도가 maven보다 최대 100배 빠름


Spring Resolver

  • Controller로 들어온 파라미터를 가공, 수정할 수 있도록 하는 기능
  • 어노테이션으로 중복코드를 줄일 수 있음

동작원리

  • DispatcherServlet에서 핸들러 실행
  • 인터셉터 동작
  • Resolver 동작 <- 실행지점
  • 메시지 컨버터 동작

사용법

  • HandlerMethodArgumentResolver 인터페이스를 상속받아 기능을 구현한다
    • supportsParameter() : 파라미터 타입을 체크 (실행 조건 체크)
      • .isAssignableFrom()을 통해 비교
      • 어노테이션을 통해 비교
    • resolveArgument() : supportsParameter가 true일 때 실행됨. 파라미터를 가공
  • 구현체를 Bean으로 띄운 후 WebMvcConfig에서 등록해줘야함
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface 어노테이션 {

}
@Component
public class 리졸버구현체 implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(어노테이션.class) != null;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
        WebDataBinderFactory binderFactory) throws Exception {
        ...
        파라미터  수정
        ...
    }
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(리졸버구현체());
    }
}


Spring Async

  • 메소드를 비동기적으로 실행시킬 수 있는 기능

동작원리

  • 비동기 메소드의 프록시를 생성한다
    • private 메소드 사용 불가
  • 비동기 메소드 실행전, Spring이 가로채 리플렉션을 통해 다른 스레드에서 실행시켜주는 방식
    • Bean으로 등록된 클래스 메소드에만 적용 가능
    • inner 메소드는 @Async 적용 불가 -> self invocation 불가

사용법

  • @EnableAsync Configuration Bean을 등록해주면 Spring에서 @Async를 사용할 수 있다
  • 내부적으로 스레드를 실행시켜줄 Executor를 사용한다
    • default는 SimpleAsyncTaskExecutor를 사용함
    • AsyncConfigurerSupport를 상속받아 Executor를 커스텀할 수 있음
  • 안전한 사용을 위해 스레드 예외처리를 해줘야한다
@EnableAsync
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize();             // 기본실행시 스레드풀 크기
        taskExecutor.setMaxPoolSize();              // 최대 스레드풀 크기
        taskExecutor.setQueueCapacity();            // 대기 큐 크기
        taskExecutor.setThreadNamePrefix("prefix"); // 스레드명 접두어
        taskExecutor.initialize();                  // 초기화
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new 예외처리();
    }
}


Apache vs nginx

Apache

  • prefork
    • 요청을 받아줄 프로세스를 미리 만들어놓는 방식
    • 부모 프로세스가 여러개의 자식 프로세스를 가짐
    • 멀티 프로세스 방식
    • 프로세스를 사용하므로 메모리 소요가 크고, 문맥교환 발생
  • worker
    • 자식 프로세스가 여러 스레드를 가짐
    • 멀티 프로세스 + 멀티 스레드 방식
    • 스레드를 사용함으로써 문맥교환 부담 줄이고 데이터 공유

Nginx

  • 싱글 프로세스 싱글 스레드로 동작해 문맥교환이 일어나지 않음
  • 자식 프로세스 내부에서 요청을 Event-Driven 방식을 사용해 비동기적으로 처리함
    • 빨리 끝나는 작업 먼저 처리
    • I/O 작업은 스레드풀로 이동시켜 처리함
  • 요청을 비동기로 처리하기 때문에 동시 접속에 상황에 유리함


CGI, uwsgi, servlet

CGI (Common Gateway Interface)

  • 웹서버와 어플리케이션 서버 사이에서 동적 컨텐츠를 생성하기 위한 규격
    • 웹서버가 넘겨준 요청을 받아 어떻게 처리할지를 정의하는 것

uwsgi

  • 파이썬으로 구현된 CGI
  • 파이썬 백엔드는 WSGI라는 CGI 규격이 따로 있고, uwsgi는 이것의 한 종류임
  • prefork 방식으로 동작함

servlet

  • 자바로 구현된 CGI 규격
  • HTTP 요청과 응답의 흐름을 간단한 메소드 호출만으로 정의할 수 있도록 도와준다