edd1e의 등록된 링크

 edd1e로 등록된 티스토리 포스트 수는 28건입니다.

(작성 중) Spring Filter, Interceptor [내부링크]

필터와 인터셉터의 차이 필터 스프링 외부의 서블릿에서 제공하는 공통처리 기능 스프링 내로 요청이 들어오기 전과 스프링의 요청이 나갈 때 처리 가능 조금 더 Low level 처리가 가능 좋은 레스토랑에 처음 들어갈 때 옷에 묻은 먼지를 털듯 제일 앞에서 필터링 해주는 곳 SQL Injection, CSRF 공격 등은 어떤 요청이든 차단되야하기 때문에 여기서 많이 처리해줬었습니다. 인터셉터 스프링에서 제공하는 공통처리 기능 HandlerMapping을 통해 어떤 컨트롤러로 갈지 이미 결정이 된 요청에 대해서 처리해줌 실제 매핑된 Handler 정보 확인이 가능(어떤 것이 실제 내 요청을 처리하는지도 확인 가능) 조금 더 상세한 조건식과 세부적인 스펙(pre, post, after)를 통해 구체적인 시점에 ..

Spring MVC [내부링크]

Spring MVC 아키텍처 * spring bean으로 표시 된 요소들은 스프링 빈으로 등록해야 하는것을 의미합니다. Spring MVC 동작 과정 클라이언트가 URL을 통해서 Request 전송 디스패쳐 서블릿은 Request를 처리하기 위한 Controller를 HandlerMapping 빈에게 검색 요청 HandlerMapping은 Client의 URL을 사용하여 이를 처리할 Controller 반환 디스패쳐 서블릿은 Controller 객체를 처리할 수 있는 HandlerAdapter에게 처리 위임 (@Controller, Controller Interface, HttpRequestHandler 어떤 방식이든 동일한 처리를 위해 HanlderAdapter가 사용됨) HandlerAdapter는 ..

(작성 중) Spring web.xml [내부링크]

https://tlatmsrud.tistory.com/35 [Spring] web.xml 이란? / 예제 1. 개요 실무 투입한지 거의 1년이 다 되어갈 무렵, web.xml 코드를 보던 중 문득 이런 생각이 들었다. '웹 애플리케이션의 첫 단추인 web.xml에 대해 누군가에게 설명할 수 있을까?' 1년간 일은 열심히 tlatmsrud.tistory.com https://ehdvudee.tistory.com/47 Servlet/Spring에서 web.xml은 어떻게 사라졌을까? 목차 Servlet에서의 web.xml 대체 Spring-Legacy에서의 web.xml 대체 Spring-Boot에서의 web.xml 대체 결론 Servlet에서의 web.xml 대체 Java6(Servlet 3.0 API)에..

Spring SpEL [내부링크]

Expression Language(표현 언어)는 짧고 간단한 문법을 통해 필요한 데이터나 설정 값을 얻어올 수 있게 하는 특별한 표현식에 가까운 간편한 언어(그래프 접근 등 가능) 입니다. SpEL은 스프링 모든 영역에서 사용 가능한 표현 언어입니다. 스프링에서 주로 많이 활용되는 부분 @Value("${config.value}"} 와 같은 방식으로 설정 값을 주입 받는데 활용됩니다. SpEL의 값 평가(evaluation) SpelParser는 "" 안에 들어있는 문자열을 평가(evaluation)해서 결과 값을 만들어냅니다. 'Hello World'는 문자열 리터럴이 되며 concat 메서드도 호출할 수 있습니다. String 객체를 new로 생성해서 사용도 가능합니다. ExpressionParse..

Spring DataBinding [내부링크]

Data Binding 사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램의 Request에 담아주는 것을 뜻 합니다. Converter Interface S(Source) 라는 타입을 받아서 T(Target) 이라는 타입으로 변환해주는 Interface 입니다. 인터페이스의 모양은 아래와 같습니다. package org.springframework.core.convert.converter; public interface Converter { T convert(S source); } 파라미터에 JSON 형식 문자열이 담겨오는 경우 해당 문자열을 곧바로 특정 DTO에 담고 싶을 때 사용합니다. // 요청 GET /user-info x-auth-user : {"id":123, "n..

Spring Validation [내부링크]

데이터를 믿고 쓰기 위해서는 `Validation`이 필요합니다. Validation 유효성 검증 주로 사용자 또는 타 서버의 요청(Http Request) 내용에서 잘못된 내용이 있는지 확인하는 행위 Validation의 종류 학문적으로는 여러 세부적인 단계들도 있지만 실제로 개발자가 주로 챙겨야하는 검증은 크게 두 종류로 나뉩니다. 데이터 검증 데이터에 필수적인 데이터가 있는지 검증 문자열의 길이나 숫자형 데이터의 경우 값의 범위 e-mail, 신용카드 번호 등 특정 형식에 맞춘 데이터 비즈니스 검증 서비스의 정책에 따라 데이터를 확인하여 검증 예) 배달 앱인 경우 배달 요청을 할 때 해당 주문건 이 결제 완료 상태인지 확인 등 경우에 따라 외부 API를 호출하거나 DB의 데이터까지 조회하여 검증하는..

Spring AOP [내부링크]

AOP (관점 지향 프로그래밍) 여러 메서드에서 동일한 코드가 반복된다면?! AOP가 해결해 줄 수 있습니다. 공통적인 관심사(로깅, 트랜잭션, 인증, 캐시 등)을 여러 메서드의 호출 전/후에 원할 때마다 손쉽게 추가할 수 있습니다. OOP로 처리하기에는 다소 까다로운 부분을 AOP라는 처리 방식을 도입하여 손쉽게 공통 기능을 추가/수정/삭제 할 수 있습니다. 기본 개념 Aspect (관점, 관심) 여러 클래스나 기능에 걸쳐서 있는 관심사를 모듈화한 것 AOP 중에서 가장 많이 활용되는 부분은 @Transactional (트랜잭션 관리), @Cacheable 기능 Advice (조언) AOP에서 실제로 적용하는 기능(로깅, 트랜잭션, 캐시, 인증 등의 코드)을 뜻함 Join point (연결 포인트) 모..

Spring Resource [내부링크]

모든 시스템은 다양한 자원들이 필요합니다. 순수 자바에서는 Stream을 통해 파일을 접근하며 외부 파일 접근 등이 모두 어렵습니다. 스프링에서는 외부 sftp, http, 파일 등에서 자원들을 쉽게 끌어올 수 있도록 Resource를 제공합니다. 스프링에서는 Resource라는 인터페이스를 만들어서 리소스를 관리합니다. Resource Interface public interface Resource extends InputStreamSource { boolean exists(); default boolean isReadable() { return exists(); } default boolean isOpen() { return false; } default boolean isFile() { return..

SOLID 원칙 [내부링크]

객체지향을 올바르게 적용할 수 있는 설계 원칙 5가지에 대해 정리하겠습니다. 1. SRP(단일 책임 원칙, 분류) 한 클래스는 하나의 책임만을 가져야 합니다. 처음, 클래스는 가벼운 책임들만을 가집니다. 하지만 연차가 쌓이고 서비스가 수정되어 나가면서 한 클래스가 너무 많은 기능을 담당하게 됩니다. 이럴 때는 클래스를 분리시켜서 가능하다면 한 가지의 책임 혹은 일부의 기능만을 수행하는 클래스를 만들어야 합니다. 컨플릭을 방지, 역할에 해당하는 서비스를 잘 찾을 수 있습니다. 2. OCP(개방 폐쇄 원칙, 교체) 클래스를 수정하지 않고 확장하라는 의미 입니다. 각 메서드에서 반복적인 if ~ else 구조가 보이게 된다면 클래스 분리를 고려하여 인터페이스를 만들고 각각의 구현체 클래스를 만들어서 확장시키면..

Java 버블 정렬, 삽입 정렬, 선택 정렬 [내부링크]

구현 난이도는 쉽지만 속도는 느린 알고리즘 1. 버블 정렬 인접한 데이터를 비교하며 자리를 바꾸는 방식 알고리즘 복잡도 O(n²) 1번째를 기준으로 잡고 시작합니다. 첫 사이클을 완료하면 가장 큰 수가 맨 뒤로 이동하기 때문에 다음 사이클은 그 전까지만 수행하면 됩니다. 방법 1) public static void bubbleSort(int[] arr) { for (int i = 1; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } 방법2) public static ..

Java 순열과 조합 [내부링크]

1, 2, 3, 4를 이용하여 세 자리 자연수 만들기 (순서 O, 중복 X) Swap 함수를 이용한 순열 swap 함수를 만들어서 배열들의 값을 직접 바꾸는 방법입니다. 배열의 첫 값부터 순서대로 하나씩 바꾸며 모든 값을 한번씩 swap 합니다. depth 를 기준 인덱스로 하여 depth 보다 인덱스가 작은 값들은 그대로 고정하고 depth 보다 인덱스가 큰 값들만 가지고 다시 swap 을 진행합니다. public class SwapPermutation { // depth: 각 자릿수 void permutation(int[] arr, int depth, int n, int r) { if (depth == r) { for (int i = 0; i < r; i++) { System.out.print(arr..

제로베이스 백엔드 스쿨 1개월차 후기 [내부링크]

서론 이 글은 어떠한 대가도 없이 작성된 내돈내산 후기 입니다. 저는 4년제 컴퓨터공학과를 졸업한 전공자 입니다. 졸업 후 백엔드 개발자로의 취업을 향해 달려가고 있었으며 특히 Spring을 기술스택으로 하는 회사에 들어가길 원했습니다. 국내의 백엔드 시장은 스프링, 전자정부 프레임워크가 정말 많은 비중을 차지하는 기술 스택이라고 느끼게 되었고 관련된 포트폴리오나 프로젝트 경험을 추가하여 취업으로 나아가기 위해 새로운 부트캠프를 찾게 되었습니다. 제가 참여하고 싶은 부트캠프는 우아한 테크코스 였습니다. 우아한 테크코스의 경우 평소 유튜브로 우아한테코톡을 자주 즐겨봤는데 테코톡을 준비하시는 분들이 우아한 테크코스의 크루분들이라고 해서 많은 것을 배울 수 있겠다고 생각했습니다. 하지만 제가 우아한 테크코스를..

피보나치 수열 [내부링크]

재귀를 이용한 방법 public int fibonacci(int N) { // f(1) = 1 // f(2) = 2 // 종료 조건 if (N

소수 구하기 [내부링크]

에라토스테네스의 체 어떠한 수의 배수는 소수가 아니므로 범위 내에서 소수가 아닌 수를 제외하는 방식 마치 체를 통과시키듯이, 소수가 아닌 수를 순차적으로 제외 public static int solution(int n) { int intArray[] = new int[n]; // 0, 1 제외 for (int i = 2; i < n; i++) { intArray[i] = 1; } // n의 제곱근까지 for (int i = 2; i

Java Exception [내부링크]

Exception의 종류 2가지 분류가 존재합니다. Checked Exception: 컴파일 시점에 체크되는 Exception Unchecked Exception: 컴파일 시점이 아닌 런타임 시점에 체크되는 Exception 연결된 예외의 처리 여러 예외 중 원인 예외를 지정해서 처리하는 방식입니다. A예외가 B예외를 발생시켰다면 A예외를 원인 예외로 지정하는 방식입니다. try { startInstall(); // SpaceException 발생 copyFiles(); } catch(SpaceException e) { InstallException ie = new InstallException("설치중 예외발생"); // 예외 생성 ie.initCause(e); // InstallException의 원..

Java 추상클래스, 인터페이스 메서드 직접 구현하기 [내부링크]

public abstract class Human { // 부모 추상 클래스 String name; String job; abstract public void showRole(); public void updateInfo(String name, String job) { System.out.println("추상 메서드에서 메서드 직접 구현"); } } public class Developer extends Human { // 추상 클래스를 구현한 자식 클래스 @Override public void showRole() { System.out.println("개발자 입니다."); } } 추상 클래스에 메서드를 직접 구현하기 위해선 일반적인 메서드 선언 형식과 동일하게 선언하면 됩니다. 하지만 인터페이스에 메서..

Java 접근 제어자와 기타 제어자 [내부링크]

접근 제어자 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다. 접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 됩니다. 따라서 default 일경우에는 접근제어자를 지정하지 않습니다. 접근제어자가 사용될 수 있는 곳으로는 클래스, 멤버변수, 메서드, 생성자 등이 있습니다. private : 같은 클래스 내에서만 접근 가능 default : 같은 패키지 내에서만 접근 가능 protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능 public : 접근 제한이 전혀 없습니다. 제어자 같은 클래스 같은 패키지 자손 클래스 전체 public protected default priva..

Java Overriding 주의점 [내부링크]

오버라이딩 시 자식 클래스는 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. class Parent { void parent() throws IOException, SQLException { // Code stuff... } } class Child extends Parent { @Override void parent() throws IOException { // Code stuff... } } Child 클래스의 parent 메서드에 선언된 예외의 개수가 부모인 Parent 클래스의 parent 메서드에 선언된 예외의 개수보다 적으므로 올바르게 오버라이딩 되었다. class Parent { void parent() throws IOException, SQLException { // Code..

Github 여러 프로젝트 자동화 스크립트 [내부링크]

인터넷에 검색하다보면 Github 1일 1커밋을 위한 자동화 스크립트가 다수 보입니다. 그러한 자동화 스크립트를 구경하다보니 일정시간 마다 여러 프로젝트를 한번에 커밋, 푸시 해주는 자동화 스크립트가 있으면 좋겠다! 라는 생각에 몇 시간만에 만들게 되었습니다. Github Repository 중 협업을 하지 않고 커밋 메시지가 중요하지 않은 Private Repository를 관리하게 되는 경우에 유용하게 사용할 수 있습니다. 자동화 스크립트를 사용하기 위해선 git init (깃 생성) git remote (깃 원격 저장소 등록) 프로젝트 폴더마다 위의 2가지 과정이 모두 수행되어야 합니다. 이제 자동화 스크립트 적용을 시작해보겠습니다. 운영체제에 따라 내용이 달라지니 해당하는 운영체제 내용만 보시면 ..

기초 수학 [내부링크]

기초 수학 경우의 수 합의 법칙(공통 된 부분을 한번 제거해줘야함): n(A U B) = n(A) + n(B) - n(A ∩ B) 곱의 법칙: n(A) * n(B) 약수 8의 약수는 1, 2, 4, 8 즉 자기 자신의 수를 1~8까지의 수로 나눴을 때 나머지가 발생하지 않는 수 재귀를 통해 구하는 방법 public static int gcd(int n, int m) { if (n % m == 0) { return m; } return gcd(m, n % m); } 최대 공약수 두 수의 약수 중 최대값으로 일치하는 수 최소 공배수 두 수의 배수 중에서 공통되는 가장 작은 값 n(A) * n(B) / gcd(최대공약수) 와 동일함 팩토리얼 팩토리얼이란 서로 다른 n개를 나열하는 경우의 수를 의미합니다. 기호..

Java 배열 사이에 콤마를 포함한 문자열로 변경하기 [내부링크]

자바 배열 사이에 콤마 넣기 입니다. 반복문의 index를 증가 시키는 부분을 반복문 내부로 변경해주면 됩니다. int[] arr = {1, 2, 3, 4, 5}; for (int i = 0; i < arr.length;) { System.out.print(arr[i]); if (++i < arr.length) { System.out.print(","); } } // Output: 1,2,3,4,5 다른 방법으로는 java.utils.Arrays의 toString 메서드를 활용한 방법입니다. int[] test = {1, 2, 3, 4, 5}; System.out.println(Arrays.toString(test)); // Output: [1, 2, 3, 4, 5]

Java String, StringBuilder, StringBuffer [내부링크]

문자열 자바에는 문자열을 다룰 수 있는 데이터형에는 3가지 종류가 존재합니다. String 개체 StringBuilder 클래스 StringBuffer 클래스 String 개체 먼저 String 개체는 자바 코드를 작성해보신 경험이 있다면 누구나 잘 아실텐데요. String의 메모리 동작 방식에 대해 간략하게 소개 해보겠습니다. String str = "text"; String str2 = "text"; String str3 = new String("text"); 먼저 위와 같은 코드 Snippet이 런타임 메모리에 올라간다고 가정하겠습니다. 위의 사진과 같이 첫 줄인 `String str = "text";` 에서 리터럴인 `text` 문자열이 Heap 영역 안의 String constant pool에 ..

JVM 동작 방식과 구조 정리 [내부링크]

Java 프로그래밍 언어 JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class)로 컴파일 할 수 있습니다. 자바 유료화의 케이스는 오라클에서 만든 Oracle JDK 11 버전부터 상용으로 사용할 때만 유료입니다. 강조된 오라클, Oracle JDK 11 이상 상용 중 하나도 만족이 안되면 유료가 아닙니다. 자바가 왜 유료가 아닌지에 대한 커뮤니티 정리 글 https://medium.com/@javachampions/java-is-still-free-c02aef8c9e04 javap -c *.class 를 통해 바이트 코드 확인이 가능합니다. JVM (Java Virtual Machine) 자바 가상 머신으로서 바이트 코드(.class)를 OS에 특화된 코드로 변환(인터프리터와 ..

다양한 Java 플랫폼 정리 [내부링크]

플랫폼 모든 Java 플랫폼은 자바 가상 머신(JVM)과 어플리케이션 프로그래밍 인터페이스(API)로 구성되어 있습니다. Java SE (Standard Edition) 가장 대중적인 자바 플랫폼입니다. 자바 언어라고 하는 대부분의 패키지가 포함된 에디션 (java.lang.*, java.util.*, java.awt.*, javax.rmi.*, javax.net.* 등) Java SE의 API는 자바 프로그래밍 언어의 핵심 기능들을 제공합니다. 원시 타입 네트워킹 보안 데이터베이스 처리 GUI 개발 XML Parsing 가상 머신, 개발 도구, 배포 기술, 부가 클래스 라이브러리, 툴킷 등을 제공합니다. Java EE (Enterprise Edition) Java EE 플랫폼은 Java SE 플랫폼을 ..

Windows 환경에서 자주 쓰는 IntelliJ 단축키 모음 [내부링크]

평소에 자주 쓰는 IntelliJ 단축키들을 모아봤습니다. 새롭게 쓰는 익숙한 단축키들이 생길 경우 지속적으로 추가하겠습니다. MacOS 유저분들은 죄송합니다!! 마지막 갱신일자: 2022/11/12 IntelliJ 단축키 Ctrl + F12 - 클래스 구조 보기 Ctrl + Shift + F10 - 해당 줄 실행 Ctrl + Shift + Enter - 줄 중간에서 바로 내려가기 Ctrl + Alt + M - 메서드 추출 Home - 줄의 시작 점 End - 줄의 끝점 Ctrl + E - 최근 사용한 파일들의 History Ctrl + Shift + T - Test 생성 Shift + Enter - 커서 내용 중간에 있어도 한줄 내리고 처음으로 이동 Ctrl + Enter - 커서 그대로 두고 밑에 공..

IntelliJ Pair 프로그래밍 플러그인 `Code With Me` [내부링크]

`Code With Me`란 JetBrains 사의 모든 IDE 환경에서 제공하는 페어 프로그래밍 플러그인입니다. 1:1 페어 프로그래밍도 가능하고 최대 100명까지 동시에 세션에 접속해서 코드 읽기, 편집 등이 가능하며 21년도부터는 디버깅, 테스팅, 비디오 챗, 스크린 공유 기능까지 추가되었습니다. 위 사진처럼 Host와 Guest가 직접 다이렉트로 TCP 통신을 하는 것이 아닌 JetBrains 사의 온프레미스 환경을 거쳐서 패킷 교환이 일어나기 때문에 매우 안전한 플러그인이 되겠습니다. 저는 IntelliJ IDE에서 페어 프로그래밍을 위해 사용할 것인데 제 OS는 윈도우이기 때문에 윈도우 기준으로 설명드리겠습니다. IntelliJ 2021.1 버전 이후부터는 `Code With Me`가 번들로서..

Java 연산자 우선순위와 표현식 평가순서 [내부링크]

과거에 김포프 선생님의 COMP1500을 수강하던 중 C#에서의 if문 평가(evaluation) 순서에 대해 공부한 적이 있습니다. 코딩을 오랫동안 한 사람은 이에 간과하고 자연스럽게 사용할 수 있지만 초심자 입장에서는 어떤 식이 먼저 평가되고 처리되지 않는지 명백하게 알아둬야 할 필요가 있습니다. 그럼 먼저 식의 평가 순서에 대해서 부터 알아보겠습니다. 평가 순서 if (1 + 1 == 2 || 3 + 2 == 5 && 1 + 2 == 2) { // 코드 생략 } 먼저 이 코드 Snippet을 보게 되면, 우선순위는 `&&`가 `|| `보다 높습니다. 하지만 평가는 1 + 1 == 2 부분이 실행되며 1 + 1 == 2가 참이기 때문에 뒤의 3 + 2 == 5 와 1 + 2 == 2는 코드 자체가 실..