본문 바로가기

WEB개발

(69)
[PATTERN] Producer - Consumer 여러 개의 producer는 각각 동일한 작업을 해서 queue에 집어넣고, consumer에서는 queue에 있는 작업을 가져가서 각자 동일한 작업으로 수행합니다.  여기서 여러 개의 producer와 consumer들이 각각 동일한 작업을 수행하는 여러개의 쓰레드 혹은 프로세스로 구성이 되므로 병렬처리가 되는 것입니다.  실무에서 사용하는 예시로 에러기록을 쌓는 경우 사용됩니다. 만약 어플리케이션 서버에 수 많은 이용자가 에러를 발생시킨다면 이 에러를 처리하는 서버는 과부가하 걸리고 다른 요청을 처리 못하게  됩니다.  이때 프로바이더 컨슈머 패턴을 사용하면 어플리케이션 서버에서 오류가 발생하면 오류를 담아두는 객체를 생성하고 해당내용을 큐에 넣어둡니다. 큐는 어플리케이션 서버에서 주기적으로 읽어 오..
[JAVA] 객체 직렬화 serialization, IOStream 1. 직렬화 serialization직렬화 serialization객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것을 말한다. 반대로 스트림에서 데이터를 읽어 객체로 변환하는 것을 역직렬화(deserialization)라 한다. 역직렬화, deserialize역직렬화는 ObjectInputStream의 readObject()를 이용한다. 다만 한 가지 주의 사항이 있는데 하나 이상의 객체를 직렬화 했을 경우 반드시 같은 순서로 역직렬화 해야 한다는 것이다. package test.serialize;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;impo..
[JAVA] AtomicInteger (thread-safe) AtomicIntegerAtomicInteger란 원자성을 보장하는 Interger를 의미한다. 멀티 쓰레드 환경에서 동기화 문제를 별도의 synchronized 키워드 없이 해결하기 위해서 고안된 방법이다.(일반적으로 동기화 문제는 synchronized, Atomic, volatile 세가지 키워드로 해결한다.) synchronized은 특정 Thread가 해당 블락 전체를 lock 하기 때문에 다른 Thread는 아무작업을 못하고 기다리는 상황이 되어 낭비가 심하다. 그래서 NonBlocking하면서 동기화 문제를 해결하기 위한 방법이 Atomic이다. AtomicInterger 동작의 핵심 원리는 바로 CAS알고리즘(Compare and Swap)에 있다.  현재 쓰레드에 저장된 값과 메인 메모리..
Jenkins & SVN or Git & Docker 형상관리는 소프트웨어 개발 및 다른 프로젝트에서 코드, 문서, 구성 요소 등의 변경을 관리하고 추적하는 과정을 말합니다. 이를 통해 개발자나 팀은 프로젝트의 이전 버전과 변경 사항을 관리하고, 협업하며, 문제를 해결할 수 있습니다. 1. CI (Continuous Integration) - 지속적 통합목적: 개발자가 작성한 코드를 정기적으로(종종 하루에도 여러 번) 중앙 저장소에 통합하여 코드 충돌을 최소화하고 빠르게 문제를 발견하는 것.주요 활동:코드 변경 사항을 중앙 저장소에 푸시하면 자동 빌드와 테스트가 실행됨.작은 단위로 자주 통합하여 충돌을 줄이고 코드 품질을 보장.필요한 도구: Jenkins, GitHub Actions, GitLab CI, CircleCI 등. CI의 주요 단계:코드 병합: ..
TheadLocal & MDC & Log4j2 서버에서 로그를  확인할 경우 grep으로 로그를 캐치할 시 라인단위로 인식하기 때문에 모든 trace를 볼 수 없다.  MDC와 log4j2를 사용하면 각 접속한 IP별로 로그를 확인 할 수 있다. ThreadLocal  ThreadLocal 변수를 선언하면 멀티 스레드 환경에서 각 스레드마다 독립적인 변수를 가지고, get(), set() 메소드를 통해 값에 대해 접근할 수 있다. public class TestThread implements Runnable { private ThreadLocal threadLocal = new ThreadLocal() { @Override protected DataObj initialValue() { DataObj dataObj = new DataObj(); ..
WEB.XML Config (context-param, init-param, web-app ... ) 1. 컨텍스트 초기화 파라미터() - context-param은 init-param 그 이상으로 전역 즉 모든 서블릿에서 사용할 수 있는 파라미터 값이다.- 항목내에 작성- 예) DD상에 작성방법 paraname paravalue  - 서블릿 상에서 호출시: getServletContext().getInitParameter("paraname");- 범위: 웹 애플리케이션에 존재하는 어떤 서블릿이나 jsp모두 2. 서블릿 초기화 파라미터()-해당 파라미터 값은 지정해준 서블릿 내에서만 쓸 수 있는 값이다.- 항목 안에 작성- 예) DD상에 작성방법 servletname servletclass paraname paravalue ..
ClassPath, ClassLoad, JAVA COMPILE(컴파일), Tomcat 클래스패스란(Class Path)란?? 클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바에서 클래스패스의 의미도 똑같다. 즉, JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로를 말하는 것이다. 소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 “바이트 코드”(바이너리 형태의 .class 파일)로 변환된다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. java -cp .:lib/library.jar com.example.Main-cp(또는 -classpath) 옵션으로 클래스패스를 지정합..
Adapter Pattern 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할수 있다.이렇게 함으로써 클라이언트와 구현된 인터페이스를 분리시킬수 있으며, 향후 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화 되기 때문에 클라이언트는 바뀔 필요가 없어진다.  예를 들어보면 기존 시스템의 서버간 통신은 EJB, Socket(TCP/IP)를 사용중이 었으나 추가된 시스템은 Http통신이 필요하다.    public class HttpTransfer { public void doProcess() { System.out.println("doProcess call : " + this.getClass().getName()); }}Transfer transfer = new HttpTransferAdapter(new HttpT..