백엔드의 업무는 뭘까? 이번에 프로젝트를 진행하면서 느낀 것은 무엇을 중점으로 생각해서 코드를 짜야하는가였다.무엇을 중점으로 생각해서 어떻게 코드로 구현해야하는거지?비즈니스 요구에서 어떤 방식이 가장 비즈니스 요구에 맞는 방법인지 고민을 했다. 만약, 내가 백엔드 주요

설치했는데,,, 안된다 왜 안되지,,?ApacheJMeter.jar를 백날 눌러도 안된다;;; 방법을 찾던 중 명령어로 실행하니 잘되었다.apache-jmeter를 다운 받아놓은 경로로 들어가면 됨 cd Desktopcd apache-jmeter-5.6.2cd binc

Web 애플리케이션에서 cashe를 사용하는 경우 클라이언트측 HTTP 캐시 사용 (프론트와 의논) 서버측 Spring 캐시 사용 -> 이전 요청과 같다면 Spring Container에서 1) HTTP에서 캐시 활용 -Cashe Validation : 캐시

대표적인 웹 공격 패턴 3가지1\. XSS(=Cross Site Scription)2\. CSRF(= Cross Site Request Forgery)3\. SQL InjectionXSS (프론트엔트 쪽에서 작업을 진행해줘야함):사용자가 웹 페이지에 악성 스크립트 삽입
Time out: 프로그램이 일정 시간이 지나도 실행 되지 않는 경우 자동적으로 종료시키는 것스프링에서는 Time out을 설정해주는 것이 중요하다. 왜냐하면 http 요청시 무한 로딩에 걸릴 수 있기 때문이다. 웹에서는 두 가지의 경우가 있다. Connection T
SQL에서 %를 사용하면 해당 위치에 어떤 문자열이든 올 수 있다는 것을 착안하여검색단어가 포함된 데이터 조회 API를 만들었다.방법! 1\. 쿼리스트링으로 검색할 단어를 받는다.2\. String 검색단어 = %쿼리스트링으로받은검색단어%3\. Repository에서
데이터베이스는 결국에는 파일을 관리하는 서버이다. 서버는 SQL을 통해서 MySQL 서버에 데이터를 요청하게 되는 것MySQL엔진 -> 스토리지 엔진 -> 운영체제 -> 디스크 로 이루어짐쿼리 파서 -> 전처리기 -> 옵티마이저 -> 쿼리 실행기로 이루어짐SQL을 파
이번 프로젝트에서 회원 가입 및 로그인을 맡게 되었다. 이번에 내가 쓸 기술을 Spring Security와 Jwt!이번 프로젝트에서는 회원 가입과 로그인을 담당하게 되었다. Spring Security 실행과 동시에 그 전에 있던 모든 Http 통신을 막는다. 인증된
스프링 부트의 예외 처리 방식크게 2가지가 존재 \-@ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외 처리\-@ExceptionHandler를 통한 특정 Controller의 예외 처리 @ControllerAdvice로 발생할 모
세션과 쿠키 클라이언트와 서버의 연결 상태 유지를 위한 기능 제공 클라이언트와 서버 사이이의 정보 공유 세션과 쿠키의 차이점
"RebbitMQ"는 오픈 소스 메세지 브로커 소프트웨어RabbitMQ는 다양한 프로그래밍 언어로 작성된 애플리케이션 간에 데이터나 메세지를 효율적으로 전송하고 통신할 수 있도록 설계 되었음RabbitMQ를 사용하면 분산 시스템 및 마이크로서비스 아키텍처에서 메세지 큐
웹소켓을 써보기 전에 소켓의 본질에 대해 공부해보려고 한다.소켓은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스 소켓은 파일과 같다.일반 파일에 대한 개념이 대부분 적용됨 프로세스는 소켓(파일)을 open,create,close,delete를 할
API : 요청과 응답을 사용하는 두 애플리케이션 간의 통신 방법을 정의 한 것REST API\->RESET : 클라이언트가 서버 데이터 액세스 할 때 사용하는 함수들 GET PUT DELETE\->REST API란 클라이언트가 서버에 데이터 액세스 할때 사용하는 함

Spring Scurity란?스프링 애플리케이션의 보안을 담당하는 프레임워크 특징Filter를 기반으로 동작함 Bean으로 설정할 수 있음 용어1.Principal : 보호된 대상에 접근하는 유저2.Authenticate(인증) : 현재 유저가 누구인지 확인 / 애플리
인덱스란 ? 컴퓨터가 편하고 빠르게 데이터를 찾게해주는 것즉, 원하는 데이터를 미리 찾아내고 복사해서 정렬해놓은 것 인덱스를 저장하는 방식에 정렬 방식이 다르다!\-> B-Tree , Hash , Fractal 등이 있으나 일반적으로 B-Tree 인덱스가 사용 됨B-T
인덱스를 적용시킨다고 무조건 좋은 것은 절대 아니다! 인덱스 필드 가공인덱스 필드를 가공하게 되면 탐색을 할 수 없음또는 인덱스에 저장된 타입과 다르다면 당연히 탐색할 수 없게 됨복합인덱스선두 컬럼을 어떤 것을 정할지가 중요하다. 왜냐하면 선두 컬럼이 인덱스를 탈 수
정규화란 중복을 제거하고, 한 곳에서만 데이터를 관리하겠다는 것!쓰기의 이점을 얻기 위해 조회 성능을 낮춘것읽을때는 항상 원본 데이터를 참고해야하는 단점이 있음.정규화1\. 중복을 제거하고 한 곳에서 관리2\. 데이터 정합성 유지가 쉬움3\. 읽기시 참조 발생반정규화(
이렇게 잘 설정되어있는데 갑자기 415Unsupported Media Type 뜨고인텔리제이서 확인해보면 .w.s.m.s.DefaultHandlerExceptionResolver : Resolved org.springframework.web.HttpMediaTypeNo
여러 SQL문을 마치 하나의 오퍼레이션으로 묶는 것.트랜잭션 A,C,I,DATOMICITY - 원자적 연산을 보장: 중간에 멈추지 않고 연산은 무조건 성공 또는 실패 MySQL에서는 MVCC로 지원 요청 \-이전의 데이터를 Undo Log로 저장 후 트랜잭션 실패
작성된 코드는 한번에 동시적으로 실행 될 수 있다!동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요MySQL에서는 트랜잭션의 커밋 혹은 록백시점에서 잠금이 풀린다.\-> 트랜잭션이 곧 락의
Redis의 정의Remote Dictionary Server Storage : 데이터 저장소 (데이터 관점)Database : 전통적인 DBMS의 역할을 수행 (영속성 관점)Middleware : 어플리케이션이 이용할 수 있는 유용한 기능 제공하는 소프트웨어 Redis

Redis는 key - value 구조이며 value에는 다양한 data type을 지원 data type은 저마다 각자의 특성을 가지고 목적에 부합한 기능을 제공 Strings 가장 기본적인 데이터 타입 바이트 배열을 저장 바이너리로 변환할 수 있는 모든 데이터
Spring Boot로 redis를 써보기종속성 추가implementation 'org.springframework.boot:spring-boot-starter-data-redis'yml에 host와 port 설정spring: host:\~~ port:6379(보통 기
Web 로그인 세션Web 상에서 특정 유저가 로그인 했음을 나타내는 정보브라우저는 Cookie를 저장하고 , 서버는 해당 Cookie에 연과된 세션 정보를 저장Spring Boot 세션 처리 과정분산 환경에서의 세션 처리Sever는 세션 정보를 저장해야 함Sever가
캐싱이란?성능 향상을 위해 값을 복사해놓은 임시 기억 장치Cache에 복사본을 저장해놓고 읽음으로서 속도가 느린 장치로의 접근 횟수를 줄임Cache의 데이터는 원본이 아니며 언제든 사라질 수 있음웹에서도 당연히 사용이 가능, 자주 바뀌지 않는 static 파일들 예를
WAS 부터 디스패치 서블릿 내부동작 흐름 파악WAS : Web Application Server WAS는 WEB 과 서블릿 컨테이너(=웹 컨테이너) 두 가지로 이루어져 있음WEB에서는 항상 같은 인풋과 아웃풋 즉, 정적인 파일 요청을 처리함동적인 요청 (REST AP
확장성이란?소프트웨어나 서비스의 요구사항 수준이 증가할 때 대응할 수 있는 능력주로 규모에 대한 확장성을 뜻함(데이터의 크기, 요청 트래픽)수직 확장(Scale-up) : 성능을 업그레이드 수평 확장(Scale-out) : 서버를 여러대 두거나 하는 것요구사항이 증가할

URL : Uniform Resource Locator의 약자로, 웹을 이용하는 사람들이 원하는 자원을 정확히 찾아 갈 수 있는 고유의 주소임. 집 주소도 작성 규칙이 있는 것처럼 URL도 작성 규칙이 있음맨 앞부분에 오며, 해당 자원을 얻기 위한 통신 규약(파일 전송
프로그램이 메모리를 사용하는 방식기계어를 포함한 모든 프로그래밍 언어의 메모리 사용 방식은 공통적으로 코드 실행 영역과 데이터 저장 영역으로 나뉜다.프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드 되어야하고 또한 프로그램에서 사용되는 변수들을 저장할 메모리도
스왑 리눅스에서 메모리 부족시 실행되는 메모리 구제 방식 > 어떻게? 스왑은 저장 장치의 일부를 일시적으로 메모리 대신 사용함 시스템의 물리 메모리가 부족한 상태가 되어 물리 메모를 획들할 때에, 기존에 사용하던 물리 메모리의 일부분을 저장 장치에 저장 하여 빈
HDDHDD는 데이터를 자기 정보로 변환하여 그것을 플래터라고 불리는 자기 장치에 기록하는 저장 장치자기 정보로 변환된 데이터 -> 플래터(자기 장치)에 저장자기 정보로 변환된 데이터는 바이트 단위가 아닌 섹터 단위로 읽고 씀1섹터의 크기는 512바이트 혹은 4K바이트
자바의 신을 가지고 공부 기록 남기기모든 프로그래밍 언어에는 예약어라는 것이 있음예악아(reserved word)는 예약되어 있으니깐 쓰지 못하는 단어예악어 public , class , int , return 등이 있으며 클래스,메소드,변수의 이름으로 사용할 수 없다
public static void main(String\[] args) {}자바 가상 머신(JVM)이 프로그램을 시작할 때 main 메서드를 호출하기 위해서는 public으로 선언되어야하기 때문이다.자바의 변수는 3가지인스턴스 변수 : 인스턴스 생성한 후에 쓸 수 있음
상속을 받게 된 하위 클래스의 인스턴스를 생성하면 상위 클래스의 기본 생성자가 먼저 호출되고 그 이후 하위 클래스의 생성자가 호출된다. 상위클래스는 하위클래스의 일부이기 때문이다. 일부이기 때문에 올바르게 초기화가 되기 위해 상위클래스의 기본 생성자를 호출하는 것이다.

12장을 공부하던 중 객체를 그냥 출력하는 것 = toString() 메소드를 호출하는 것과 같음을 볼 수 있었다.System.out.println(obj) 호출은 내부적으로 obj.toString()을 호출한다.println 메소드가 obj를 문자열로 출력하기 위해
프로젝트를 만들면서 final을 참 많이 봤다. 근데 정작 왜 쓰는지를 몰랐다. 그 때는 하나 하나 살펴 볼 여력(?) 또는 뒷받침 지식이 부족했다. 솔직히 "기능만 되면 되는거지~!"하고 final을 쓰는 의미조차 모른채 프로젝트를 진행했었다. 프로젝트를 통해 어떻

인테리어 업계에 있을때 경험담 - 디테일이 실력이다 - 나는 인테리어 현장 관리자로도 일 해본적이 있다. 인테리어 시공현장은 공정대로 진행이 되는데 각 공정마다 전문가 혹은 기술자분들을 모셔서 작업을 진행한다. 예를 들어 목수분들이 틀을 잡을 때이다. 목수분들이 틀을
구글에 검색해보면 java8 부터 permgen 영역이 meta space로 바뀌었다고 한다. meta space로 바뀌면서 native 메모리를 쓰게 되었다는 것.많은 글들이 meta space로 바뀌었다고 알려준다. 바뀐건 알겠어. 근데 왜 바뀌었을까에 대한 답이
OOP의 4대 특성은 캡슐화,상속,추상화,다형성 이라고 알고 있다. 어느 책에서나 어느 블로그에서나 볼 수 있을 것이다. 그런데 OOP는 왜 4대 특성을 가지게 된 것일까? 이미 가지고 있던 특성을 발견한 것인가? 아니면 특성을 정의를 해서 OOP라는 개념을 만들어낸

call by value call by reference 이 두가지 용어는 함수가 매개변수를 받을때 어떤 방식으로 받는가이다.call by valueint a = 3; void swap(int x) { x = 5;}swap(a)라면 a의 값은 어떻게 될까?a = 3
동일성 : == 연산자를 이용해 식별값으로 같은지 확인할 수 있음== 연산자는 기본데이터 타입, 참조 타입의 경우 다르게 작동한다.기본 데이터 타입값이 직접 비교하므로 true가 나옴참조 타입객체가 생성된 heap 메모리 주소를 비교하기 때문에 false가 나옴불변객체
멘토분께서 이런 말씀을 하셨다."제네릭을 어떻게 활용하는가가 주니어에서 중니어로 판별이 되는 기준이 될 수 있다!"그러면 제네릭이 무엇인지부터 알아봐야겠다. Generic을 배웠긴했지만, 그냥 그런가보다 싶었다. 타입을 나중에 정해서 쓰면 되는건가보다 싶었다. 제네릭
모든 기술은 핵심 컨셉을 제대로 이해해야 내 것이 된다고 한다. 그렇다면 스프링은 핵심 컨셉은 뭐였을까? 스프링의 핵심 컨셉은 바로 “객체지향 프로그래밍이 가능하게 만드는 것” 이였다. 프로그램을 명령어의 집합들로 보는 것이 아니라, 객체들의 모임으로 보며 객체들의
클린코드로 유명한 로버트 마틴이 정의한 것SRP 단일 책임 원칙한 클래스는 하나의 책임만 가져야 한다.하나의 책임이라는 것은 모호함 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 기준은 변경 이다.책임을 적절하게 잘 조절하는게 객체지향원칙의
애플리케이션을 하나의 공연이라 생각해보자.각각의 배역이라하면 인터페이스라고 하면, 로미오나 줄리엣의 역할을 누가 정할지는 배우(구현체)가 정하는게 아니다. 로미오 역할 = 디카프리오? 마동석? 배우가 역할을 하고 싶다고 그 역할을 할 수 있는게 아니다.관심사를 분리해야
스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다.대부분의 스프링 어플리케이션은 웹 어플리케이션이다. 웹 어플리케이션은 보통 여러 고객이 동시에 요청을 한다. 웹 어플리케이션은 태생이 요청이 많을 수 밖에 없다.스프링이 없는 DI컨테이너에서는 새로운
클래스사용자가 직접 정의하는 사용자 정의 타입을 만들기 위한 설계도클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있음새로운 개념을 도입하기 위함! 객체 또는 인스턴스설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체라고 함 new 예
WAS에 요청이 왔을때, 서블릿에게 요청을 누가하지?그것을 바로 스레드가 한다. 쓰레드애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드쓰레드가 없다면 자바 애플리케이션 실행이 불가능쓰레드는 한번에 하나의 코드 라인만 수행쓰레드 풀연결 요청이 오면 쓰레드 풀에
생성자를 통한 의존관계 주입생성자를 통해서 의존 관계를 주입 받는 방법외부에서 변경 시킬 수 있는 방법이 없음 생성자 호출 시점에 딱 1번만 호출되는 것이 보장됨!불변,필수 의존관계에서 사용됨private final로 되어 있으면 값이 반드시 있어야 한다는 것이다.생성
자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 대입하는 것이다.기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어있는 실제 사용하는 값을 복사해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서
null 참조형 변수에는 메모리 상에 객체가 있는 위치를 가리키는 참조값이 들어간다. 그런데 아직 가키리키는 대상이 없거나,가리키는 대상을 나중에 입력하고 싶다면 어떻게 해야할까? 참조형 변수에는 아직 가리키는 대상이 없다면 null이라는 특별한 값을 넣어둘 수 있
프로그래밍의 두가지 방식프로그래밍 방식은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 나눌 수 있다.절차 지향 프로그래밍절차 지향 프로그래밍은 절차를 지향한다.실행 순서를 중요하게 생각하는 방식이다.프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다.“어떻게
웹 스코프의 특징웹 스코프는 웹 환경에서만 동작한다.웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다.웹 스코프 종류request : HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프, 각각의 HTTP
클라이언트에서 서버로 http 요청을 보내는 방법은 3가지인데, 이게 정리가 안되어서 깔끔하게 정리를 하려고 한다.HTTP 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법GET - 쿼리 파라미터 POST - HTML FormHTTP message bod
자바 메모리 구조자바의 메모리 구조는 크게 메서드 영역,스택 영역,힙 영역 3개로 나눌 수 있다.메서드 영역 : 클래스 정보 보관스택 영역 : 실제 프로그램이 실행되는 영역. 메서드가 실행될 때마다 하나씩 쌓인다.힙 영역 : 객체가 생성되는 영역. new 명령어를 사용
지역변수는 스택영역에, 객체는 힙 영역에서 관리한다.참고로 스택 영역은 쓰레드 별로 각각 생성된다! static 변수static 키워드는 주로 멤버 변수와 메서드에 사용된다. 특정 클래스에서 생성된 인스턴스는 생성될 때 필드 값을 초기화한다. 만약 각각 인스턴스가 공유
클래스에 메서드가 하나만 있다고 가정해보자. 클래스 안에 있는 메서드를 사용할 경우 매번 인스턴스를 생성해야한다. 단지 메서드를 쓰기 위해서 매번 인스턴스를 새로 생성해야하는 것은 메모리 낭비이다. 그리고 코드도 지져분해진다.이럴 경우 어떻게 하면 좋을까?정적 메서드정
final 키워드final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. final 지역 변수 선언시 바로 초기화 한 경우 이미 값이 할당되었기 때문에 값을 할당할 수 없다.매개변수에 final이 붙으면 메서드 안에서 매개변수의 값을 변경할 수 없다. 따라서
상속 받은 객체를 생성하면?하위 클래스와 상위클래스의 인스턴스가 같이 생성된다. 단 참조값은 하나이지만 하위 타입 인스턴스와, 상위 타입 인스턴스가 존재한다. 외부에서 볼때는 하나의 인스턴스이지만 내부에서는 상위 타입과 하위 타입 모두 생성되고 공간도 구분된다.메서드
부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수 없다. 이 때 super 키워드를 사용하면 부모를 참조할 수 있다.super는 이름 그대로 부모 클래스에 대한 참조를 나타낸다. 코드로 봐보자public clas
다형성다형성은 이름 그래도 다양한 형태,여러 형태를 뜻한다. 프로그래밍에서는 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 보통 하나의 객체는 하나의 타입으로 고정되어 있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있
부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라고 한다. 추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다. 따라서 실체인 인스턴스가 존재하지 않는다. 대신에 상속을 목적으로 사용되고! 부모 클래스 역할을 담당한다 \-> 부모 클래스
자바는 순수 추상 클래스를 더 편리하게 사용할 수 있는 인터페이스라는 기능을 제공한다.인터페이스 특징순수 추상 클래스의 특징과 같음인터페이스는 상속이 아니라 구현이라고 한다.상속 vs 구현 상속은 이름 그대로 부모의 기능을 물려 받는 것이 목적이다. 하지만 인터페이스는
HTTP 헤더 HTTP 전송에 필요한 모든 부가정보를 모아두는 용도이다. 메세지 본문을 통해 표현 데이터를 전달 메세지 본문 = 페이로드 표현은 요청이나 응답에서 전달할 실제 데이터 표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공 > 표현 Content-Ty
모든 클래스가 Object 클래스를 상속 받는 이유는공통 기능 제공 과 다형성의 기본 구현 을 하기 위해서이다.객체의 정보를 제공하고, 이 객체가 다른 객체와 같은지 비교하고, 객체가 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에게 필요한 기본 기능이다. 이런
Object 클래스가 최상위 클래스인 이유는 객체들의 공통적인 기능을 제공하기 위함이다. 그렇다면 Object 클래스가 가지고 있는 기능 중 하나인 toString은 어떻게 쓰는걸까?toStringObject.toString 메서드는 객체의 정보를 문자열 형태로 제공한
자바에서 제공하는 굉장히 많은 클래스들이 불변 객체로 설계가 되어 있다. 불변 객체는 프로그래밍에서도 중요한 개념이다.기반 개념으로 기본형과 참조형의 공유에 대해서 알아야한다.자바의 데이터 타입을 가장 크게 보면 기본형(Primitive Type)과 참조형(Refere
자바에서 문자를 다루는 대표적인 타입은 char , String 2가지가 있다. 기본형인 char는 문자 하나를 다룰 때 사용한다. char를 사용해서 여러 문자를 나열하려면 char 을 사용해야 한다. 하지만 char 을 직접 다루는 방법은 매우 불편하기 때문에 자