Docker와 Jenkins Spring windows에서 자동배포
·
JPA 게시판/JPA게시판 만들기
자동배포깃허브에 내가 원하는 브랜치에 푸시 또는 머지가 된다면 새로 빌드되어서 배포를 시킨다.DOOP 형태로 젠킨스도커에서 새로운 도커를 만들 때, 젠킨스 외부 운영체제에 있는 도커를 이용하여 새로운 컨테이너를 만든다.필요요소젠킨스 도커 > 외부 운영체제의 도커에 접근 가능한 방법젠킨스에서 깃 훅의 정보를 브랜치별로 나눠서 가져올 수 있는 방법배포될 스프링 깃 레포지토리에 Dockerfile을 놓는 것 (해당 도커파일을 사용해서 서버를 배포할 예정이기 때문)배포방식원래 ec2 그러니까 여러개의 서버를 이용하는 경우, DockerHub를 사용해서 도커 이미지 파일을 공유하고, 그 파일을 배포서버에서 내려받아 사용하겠지만, 지금은 하나의 컴퓨터에서 모든 파일을 관리하고 있기 때문에 도커파일을 이미지로 빌드하..
새로운 환경설정 (서버분리)
·
JPA 게시판/JPA게시판 만들기
도커를 이용한 새로운 환경설정보편적인 서버 환경을 만들어서 시험해보기 위해서, 도커를 사용하기로 했다.환경 설정 구조스프링 서버가 올라갈 도커(실제 백엔드 서버-레디스가 추가된다면 이 도커에 추가될 예정)DB도커(mysql 8.0.32 기반) 젠킨스 도커환경 설정 이유스프링 서버만 독립적으로 놓는 것이 추후 확장에 있어서 좋다고 판단 - 로드밸런싱을 위한 다수 서버 운영DB의 경우, 별개의 서버로 운영해야 여러개의 서버에서 오는 요청을 받을 수 있다고 생각, 추후 마스터-슬레이브 구조로 여러개의 DB서버 구조로 바꿀 때도 유리하다고 판단젠킨스는 서버 빌드, 스프링 서버 업로드 등 여러 관점에서 봤을 때, 분리해 놓는 것이 좋다고 판단.위 세가지 이유에서 도커를 사용해서 서버를 분리하여 사용해보기로 했다...
stmt와 pstmt의 차이
·
JAVA/웹 프로그래밍 딥하게 파보기
데이터베이스 접근데이터베이스에 접근할 때, statement를 선언하고 접근해 본 적이 있을 것이다.근데 PreparedStatement와 무슨차이인가? 결국 같은 쿼리문을 보내는 것이 아닐까? 프로시저의 차이가 발생한다.라이브러리 캐시1. SQL문을 하나 사용할 때, 내부적으로 옵티마이저와 로우소스 생성기가 자동으로 프로시저를 만들어서 라이브러리 캐시에 할당하게 된다. 2. SQL문은 소문자 대문자와 같이 한 글자의 차이로도 새로운 프로시저를 만들게 되어있다.3. 즉, 로그인 할 때, 유저아이디를 이용해서 찾게되면, 새로운 프로시저가 유저 수 만큼(500만명 로그인하면 500만개)가 라이브러리 캐시에 저장되게 됨4. 이런 문제를 방지하기 위해 바인드변수가 존재하고, 바인드변수를 사용하는 방법이 Prep..
왜 무상태여야하는가?
·
JAVA/웹 프로그래밍 딥하게 파보기
Rest API의 무상태성REST API의 특징 중 하나인 무상태성은 상태를 서버에 저장하지 않는다는 것이다.서버에 상태가 저장되면 항상 클라이언트의 요청은 같은 서버에 요청해야하는데그런 세션을 고정하는 방법을 로드밸런서에서 제공하게 된다.하지만 그런 방식을 사용하게 되면 로드밸런서의 부담이 커지게 된다. 위 단점을 극복하기 위한 것이 무상태성을 갖춘 서버를 만드는 것이다.어느 서버에 가더라도 똑같은 데이터를 제공한다면, 굳이 세션을 유지하거나, 같은서버로 요청을 보낼 필요가 없다.그래서 요청에 필요한 유저 데이터를 클라이언트에 저장하였다가, 요청 때마다 헤더에 넣어 전송하여 인증과 인가를 통과하고, 이 유저가 받을 수 있는 데이터를 제공하게 된다. 즉, 어느 서버에서 요청을 받더라도 인증이 가능해지므로..
스프링 대규모 요청이 왔을 때
·
JAVA/웹 프로그래밍 딥하게 파보기
기본적으로 스프링에서 대규모 요청이 왔을 경우, 톰캣 기반으로 되어있어 쓰레드 풀에 들어있는 객체에 자리가 있다면 동시요청중 쓰레드 풀만큼의 숫자정도 요청은 받을 수 있다.하지만 그걸 넘어서면 어떻게 될까?큐에 저장이 되고, 쓰레드가 요청을 처리하면 빈 쓰레드에 그 큐에 들어있는 값들이 처리가 되기 시작한다.그럼 설정해둔 큐 사이즈를 넘어서는 요청이 더 들어오면?바로 오류가 난다.그럼 이런 현상을 방지하기 위해서는 어떻게 해야할까?수직적 규모 확장 vs 수평적 규모 확장수직적 규모 확장단순히 성능을 늘리거나, 메모리를 늘리는 방법처리속도를 빠르게 만들어서 쓰레드가 빠르게 비워지도록 함.단, 컴퓨터의 성능향상에는 한계가 있으므로, 어디까지나 한계가 존재하고, 자동 복구나 다중화가 되지않음서버가 다운되면? ..
스프링의 역할
·
JAVA/웹 프로그래밍 딥하게 파보기
그렇다면 스프링은 왜 필요한걸까?이미 톰캣이 url에 따라서 어떤 메서드를 연결하고 실행시키고 응답을 줄지 다 정하고있는데?스프링의 근본부터 공부하자 스프링2000년대 초, EJB(Enterprise Java Bean)가 주류였는데, 너무 복잡하고 어려웠음로드 존슨이 복잡한 EJB 대신, 가벼운 *POJO 기반의 개발 방법 제안오픈소스 프로젝트로 스프링을 공식적으로 출시IoC(제어역전): 객체의 생명 주기를 개발자가 아니라 컨테이너가 관리하게끔 함AOP(관점 지향 프로그래밍): 여러 서비스 또는 함수에 걸처 있는 관심사(로깅, 트랜잭션)을 비즈니스 로직에서 분리하여 관리IoC란매번 제어 역전이라는 말로 혼란스럽게 하는데, 결국 앱에서 사용하는 객체(클래스의 인스턴스) 를 만들어서 저장해두고, 필요할 때 ..
자바로 HTTP 네트워크 요청이 전송되는 원리를 알아보자
·
JAVA/웹 프로그래밍 딥하게 파보기
자바로 HTTP 요청은 어떻게 주고받아 지는걸까? Spring을 사용하면서 궁금한 점을 모두 공부해보자 0. 들어가며오늘 알아볼 내용은 톰캣이 어떻게 HTTP 요청을 받고, 처리하고, 서블릿으로 전달하는지 알아볼 것이다.지금까지 Spring boot를 사용하면서, 또는 Spring mvc를 사용하면서 톰캣을 사용했지만 어떤식으로 요청이 전달받아지고 있는지까지는 생각하고있지 않았다.오늘은 톰캣이 어떻게 요청을 받고있는지 원리를 Chat GPT를 활용해가면서 공부할 것이다. 1. 소켓- ip와 포트를 이용해서 네트워크 양방향 소통을 처리하는 구성요소- TCP / IP 또는 UDP 등의 프로토콜을 사용해 데이터를 전송할 수 있음가장 기본적인 구성요소로, 모든 HTTP 통신은 이 소켓을 통해서 구현된다- 채팅,..
웹 프로그래밍 딥하게 파보기
·
JAVA/웹 프로그래밍 딥하게 파보기
웹 프로그래밍을 딥하게 파보자웹 프로그래밍을 시작하게 되면서, 이렇게 하면 그냥 이렇게 되요. 이런식으로 공부해왔다. 그렇지만 추후 이런 방식으로는 문제를 해결해야할 때 원인 분석부터 제대로 하지 못할 것이 분명하다. 문제 해결을 위해서는 기초 지식이 가장 중요하다.목표서블릿부터 시작해서 어떻게 웹이 동작하는지에 대해 파본다.chat GPT를 활용해서, 꼬리질문을 하면서 어떤 방식으로 구현되어있는지 자세히 살펴본다.평소에 궁금했던, 이상했던 점을 공부한다.스프링만 해도 이상했다. 어떻게 localhost:8080만 쳐도 톰캣이 실행하고 있는 서버에 요청을 보내고, 그 요청을 감지하고 리턴을 주는거지?http요청을 어떻게 처리하게끔 만들어두었을까?대충 아는 부분을 깊게 공부 한다.프로젝트를 하다보면 문제가..