전체 글 110

웹 서버와 서블릿 컨테이너

웹 서버와 서블릿 컨테이너 외장 서버 톰캣 같은 WAS (웹 애플리케이션 서버) 를 설치 서블릿 스펙에 맞추어 코드 작성 후 WAR 로 빌드, war 파일을 만듦 ➡️ 배포 내장 서버 스프링 부트가 내장 톰캣을 포함 JAR 빌드, jar 실행 시 was 도 함께 실행됨 실습 tomcat 10 이상 java 17 웹 서버에 띄울 html 생성 서블릿 등록 동작 순서 '/test' 로 요청이 오면 서블릿 실행 'TestServlet.service' 출력 'test' 로 응답 실행 시 톰캣 (WAS)에 배포 후 실행해야함 war 빌드와 배포 프로젝트 폴더로 이동 cmd 창에서 프로젝트 빌드 (윈도우 : gradlew build) war 파일 생성 확인 (build/libs/server-0.0.1-SNAPSHO..

링크드 리스트 (Linked List) - 2

더블 링크드 리스트(Doubly linked list) 이중 연결 리스트 양방향으로 연결되있어, 탐색이 양쪽으로 가능함 더블 링크드 리스트 구현 public class DoubleLinkedList { public Node head = null; puclic Node tail = null; public class Node { T data; Node prev = null; Node next = null; public Node(T data) { this.data = data; } } /* * 추가 */ public void add(T data) { if(this.head == null) { this.head = new Node(data); thus.tail = this.head; } else { Node n..

코테/자료구조 2023.08.10

링크드 리스트 (Linked List) - 1

링크드 리스트 (Linked List) 연결구조 리스트 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터구조 알아야 할 용어 노드 (Node) : 데이터 저장 단위 (포인터) 로 구성 포인터 (Pointer) : 하나의 노드에서 다음/이전 노드의 연결 정보를 가지고 있는 공간 링크드 리스트 형태 링크드 리스트 장/단점 배열과 다르게 미리 공간 할당을 하지 않아도 됨 연결정보를 담는 공간이 필요, 저장공간 효율이 높지 않음 접근 속도가 느림 중간 데이터 삭제 시 앞뒤 연결을 재구성 해야함 링크드 리스트 구현 (한번쯤은 코드 작성하면서 이해하기) public class SingleLinkedList { puclic Node head = null; public class Node { T data..

코테/자료구조 2023.08.10

스택 (Stack)

스택 (Stack) 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조 가장 나중에 쌓은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조 (LIFO) 운영체제가 사용하는 시스템 스택이 이와 같은 구조 스택 (Stack) 선언 스택은 java.util 패키지에서 Stack 제공 import java.util.Stack; Stack stack = new Stack(); 스택 (Stack) 넣기 // push() 시 해당 value값 리턴함 stack.push(1); // Stack 에 1 추가 stack.push(2); // Stack 에 2 추가 stack.push(3); // Stack 에 3 추가 스택 (Stack) 꺼내기 // 제일 마지막으로 넣은 데이터가 꺼내짐 stack.pop(); 스택 (Stack) ..

코테/자료구조 2023.08.03

큐 (Queue)

큐 (Queue) 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조 FIFO(First-In, First-Out) 또는 LILO(Last-In, Last-Out) 방식 프로세스 스케쥴링에 많이 쓰임 큐 (Queue) 선언 큐는 java.util 패키지 LinkedList 를 사용해 선언해야 함 import java.util.LinkedList; import java.util.Queue; Queue queue = new LinkedList(); 큐 (Queue) 추가 /* * 해당 큐 맨 뒤에 값 삽입 * 값 추가 성공 시 true 반환 */ queue.add(1);// 큐가 꽉 찬 경우 IllegalStateException 에러 발생 queue.offer(2);// 값 추가 실패 시 false 반..

코테/자료구조 2023.08.03

배열 (Array)

배열 (Array) 데이터를 나열하고, 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조 순서 (index)를 가진 데이터의 집합 - 가장 기본적인 자료구조 생성과 동시에 크기가 고정됨 전체 원소가 메모리상 일렬로 저장됨 0 1 2 3 4 5 6 7 8 9 9 4 -3 10 2 0 3 7 8 10 장점 메모리가 연속적이기 때문에 빠른 접근 가능 (인덱스 번호로 접근) 단점 고정 길이라서 데이터 추가/삭제의 어려움 1차원 배열 [ ] 를 통해 선언 각 요소는 { } 내 콤마로 작성 // new 키워드를 사용해서, 배열을 미리 선언하고, 데이터를 넣을 수도 있음 Integer[] data = new Integer[10]; data[0] = 1; // 직접 배열 데이터 선언과 동시에 넣을 수도 있음 Inte..

코테/자료구조 2023.07.28

Spring Framework

Framework 사용 유지보수 용이 생산성 ⬆️ 배우는 이유? 발전과정과 스프링의 원리를 알기 위해 Servlet ➡️ JSP ➡️ Spring ➡️ SpringBoot 스프링 등장 ➡️ 당시 엄청 복잡함 (EJB, Enterprise Java Beans) ➡️ J2EE 등장 (스프링의 문제점 지적) ➡️ 스프링 프레임워크 등장 ➡️ Bean 등록 지옥 ➡️ 스프링부트 등장 스프링부트 Boot 최소한의 인간 개입으로 시작하고 완전히 작동하는 것을 의미 시작을 위한 복잡한 설정 과정은 스프링 부트가 해결 개발자는 새로운 스프링 애플리케이션을 쉽고 빠르게 시작 스프링부트 특징 스프링을 편리하게 사용할 수 있도록 지원 Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨 (WAS) 라이..

서비스의 인증과 권한 부여

보안 용어 이해 인증 (Authentication) 사용자가 누구인지 확인하는 단계 ex) 로그인 로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 토큰 (token)을 전달 실패한 사용자는 토큰을 전달받지 못해 원하는 리소스에 접근 불가 인가 (Authorization) 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때, 해당 리소스에 접근할 권리가 있는지 확인 ex) 특정 게시판 게시판 접근 등급을 확인해 접근을 허가하거나 거부 접근 주체 (Principal) 애플리케이션 기능을 사용하는 주체 ex) 사용자 또는 디바이스, 시스템 스프링 시큐리티 동작 구조 서블릿 필터 (Servlet Filter) 기반 동작, DispatcherServlet 앞에 필터 배치 필터체인 (FilterChai..

액추에이터 & 서버 간 통신

액추에이터 HTTP 엔드포인트나 JMX를 활용해 애플리케이션을 모니터링 하고 관리할 수 있는 기능 제공 * JMX (Java Management Extensions) 실행 중인 애플리케이션으 상태를 모니터링하고 설정을 변경할 수 있게 해주는 API JMX를 통해 리소스 관리를 하려면 MBeans(Manage Bean)를 생성해야함 액추에이터 종속성 추가 액추에이터 기능을 사용하려면 애플리케이션에 spring-boot-starter-actuaor 모듈의 종속성을 추가해야함 엔드포인트 애플리케이션의 모니터링을 사용하는 경로 스프링부트는 여러 내장 엔드포인트가 포함돼 있으며, 커스텀 엔드포인트를 추가 할 수 있음 액추에이터를 추가하면 기본적으로 엔드포인트 URI로 /actuator 가 추가되며, 뒤에 경로를 ..

유효성 검사와 예외처리

유효성 검사 데이터를 사전 검증하는 작업 일반적인 애플리케이션 유효성 검사 문제점 계층별로 진행하는 유효성 검사 관리하기 어려움 중복코드 존재 길어지는 검증코드 Hibernate Validator Bean Validation 명세의 구현체로 도메인 모델에서 어노테이션을 통한 필드값 검증을 가능하게 도와줌 스프링 부트에서의 유효성 검사 유효성 검사 라이브러리를 의존성으로 추가하면 사용할 수 있음 spring-boot-starter-validation 유효성 검사는 각 계층으로 데이터가 넘어오는 시점에 해당 데이터에 대한 검사를 실시함 계층간 데이터 전송에 대체로 DTO 객체를 활용하고 있기 때문에 DTO 객체를 대상으로 수행하는 것이 일반적 이외 @Validated 어노테이션과 커스텀 Validation을..