[기타] 개발상식
Updated: Categories: CS여러가지 개발 상식 계속 정리하기
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
- 둘다 실행가능한 자바 소스를 압축한 파일임
- 어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 패키징
- 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
를 커스텀할 수 있음
- default는
- 안전한 사용을 위해 스레드 예외처리를 해줘야한다
@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 요청과 응답의 흐름을 간단한 메소드 호출만으로 정의할 수 있도록 도와준다