BackEnd 17

SOLID 원칙이란?

객체지향에서 소프트웨어를 변경에 유연한 구조, 이해하기 쉬운 구조로 만들기 위한 5가지 원칙으로 각 원칙들의 앞글자를 따서 SOLID 원칙이라 불린다. SRP - 단일 책임의 원칙하나의 클래스에서 하나의 책임만 가져야 한다 책임은 매우 주관적인 단어라 이해하기 조금 어려울 수 있는데좀 더 쉽게 표현하자면 하나의 클래스의 변경은 오직 하나의 이유만으로 이루어져야 한다라고 말할 수 있다. 만일 SRP 원칙을 지키지 않을 경우 어떤 문제가 발생하는지 예시를 통해 알아보자YG쇼핑몰에서는 회원가입을 했을 경우 가입 환영 이메일을, 주문을 완료했을 경우 주문 내역 알림 메일을 발송해준다.각각 sendWelcomeMail, sendOrderMail 메소드로 기능을 제공하며, 둘 다 메일을 발송해야 하므로 sendMa..

BackEnd/Java 2024.12.31

어노테이션은 사실 깡통이다.

이전글 : https://potwings.tistory.com/66 [Spring MVC] Filter에서 파라미터 처리하는 방법Servlet의 Filter를 구현하는 Filter클래스에서 POST로 전달되는 Body에서 JSON을 불러와 처리해야할 일이 있었다.따라서 Filter에서 아래와 같이 Request에서 값을 불러왔다. @Override public void doFilter(ServletRequpotwings.tistory.com 이전 글에서 Request에서 JSON으로 된 파라미터를 불러올 때 아래와 직접 코드 작성하여 파라미터를 받아왔었다.허나 평소에 Controller에서 JSON을 전달받을 때는 파라미터 앞에 @RequestBody를 추가해주는 것 만으로 불러올 수 있었다.  따라서 ..

BackEnd/Spring 2024.09.22

Spring Boot main 2배 버그 팝니다@@@@@

최근 cli로 된 어플리케이션을 개발하였다.어플리케이션 실행 후 사용할 DB 정보를 입력을 통하여 받고 싶었으나 Spring의 경우 DataSource가 우선 생성되어야 어플리케이션이 실행될 수 있었다. 따라서 Spring 구동 이전의 main 메소드에서 DB 정보를 받아오도록 아래와 같이 진행하였다.  public static void main(String[] args) { try { br = new BufferedReader(new InputStreamReader(System.in)); String dbUrl = validDBURL(); // IP PORT 연결 테스트 String schema = validInputString("DB 스키마"); jdbcUr..

BackEnd/Spring 2024.09.18

[Spring MVC] Filter에서 파라미터 처리하는 방법

Servlet의 Filter를 구현하는 Filter클래스에서 POST로 전달되는 Body에서 JSON을 불러와 처리해야할 일이 있었다.따라서 Filter에서 아래와 같이 Request에서 값을 불러왔다. @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletInputStream inputStream = request.getInputStream(); ObjectMapper objectMapper = new ObjectMapper(); PersonDTO dto = objectMapper.readV..

BackEnd/Spring 2024.08.01

KMP - 문자열 탐색 알고리즘 (By Java)

문자열 탐색 성능 개선 중 KMP알고리즘을 사용하면 기존의 브루트포스 알고리즘보다 더 좋은 성능이 나온다는 이야기를 들었다.정확히 어떻게 성능을 더 빠르게 하는지가 궁금하여 자세한 내용을 정리해보고자 한다. 이 글은 아래 글을 참고하여 작성하였다.https://bowbowbow.tistory.com/6 KMP : 문자열 검색 알고리즘문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했을bowbowbow.tistory.com KMP 알고리즘이란?문자열 비교 시 효율적인 인덱스 조정을 통해 이미 비교했던 문자열을 최대한 다시 비교하지 않도록 하여 성능을 개선한 문자열 탐색..

BackEnd/Java 2024.05.29

X바(자바) finalize 메소드 쓰지마세요

Java9부터는 Deprecate 되었어요 쓰지 마세요. 과거 필자는 특정 객체 동작하면서 남긴 임시 파일을 해당 객체가 소멸될 때 제거되도록 하기 위해finalize 메소드를 사용하여 처리하려 했던 적이 있었다.허나 적용하기 위해 검색하여 보니 finalize 메소드를 사용하지 말라는 내용이 많았고이펙티브 자바에 자세하게 설명되어 있어 이 내용을 한번 정리해보고자 한다. finalizer란?자바에서 객체가 더 이상 참조되지 않을 때 Garbage Collector가 객체에 할당한 메모리를 회수하기 전객체의 finalize 메소드의 내용을 진행하는 객체 소멸자이다.이외에도 자바에는 cleaner라는 객체 소멸자가 하나 더 있다. finalizer 예시public class Finalize { @Over..

BackEnd/Java 2024.05.06

Java HashMap의 내부 동작 - 해시 버킷 개수 조정

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 자바의 HashMap의 성능을 위한 해시 버킷의 개수에 관련해 알아보자 해시 버킷 개수 조정 우선 저번 글에서 확인하였듯이 HashMap에서는 데이터를 해시버킷에 나누어 저장해둔다. 여기서 해시버킷의 인덱스 계산을 "X.hashCode() % M(해시 버킷의 개수)"을 통하여 진행하는데 만일 해시버킷의 개수가 적다면 데이터가 증가할 수록 더 많은 해시충돌이 발생할 것이고, 이는 성능 저하로 이어지게 된다. 이를 방지하기 위해 HashMap에서는 데이터 개수가 "load factor(기본값 3/4) * 현재 해시 버킷의 개수"에..

BackEnd/Java 2024.04.21

Java HashMap의 내부 동작 - 실전편

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 Java에 HashMap이 실제 코드로 어떻게 되어있는지 확인해보자 한다. 데이터 삽입(put) put 메소드의 데이터 추가는 아래 3가지의 경우를 순서대로 처리한다. 1. 해당 인덱스의 해시 버킷(LinkedList) 확인 - 해당 해시 버킷에 값이 없을 경우 새로운 Node 추가 후 종료 2. 해당 해시 버킷의 키 값 일치여부 확인 - key가 일치할 경우 해당 키에 대한 값 변경해준 후 종료 3. 해당 해시 버킷에 값 추가 - Tree일 경우와 / LinkedList일 경우 분기하여 처리 final V putVal(int..

BackEnd/Java 2024.04.16

Java HashMap의 내부 동작 - 이론편

해당 글은 Java8 기준으로 작성되었습니다. https://potwings.tistory.com/56 Java HashSet, HashMap 내부 구조 & List보다 contains의 성능이 더 좋은 이유알고리즘 문제를 풀거나 실무에서 Hash 자료 구조를 자주 접하게 된다. 이들을 사용하면서 궁금했던 점, 느낀 점에 대해 정리해보고자 한다. HashSet이 HashMap보다 성능이 좋지 않을까? 우선 필자는 Hpotwings.tistory.com이전 글에서 ArrayList와 HashMap의 contains의 성능을 비교해보았고HashMap의 contains는 HashMap에서 get 후 null 체크를 진행하는 것을 확인하였다. 여기서 HashMap에서 get은 단순히 키값을 hashCode와 e..

BackEnd/Java 2024.04.14

DTO 그렇게 쓰는 거 아닌데 ㅋㅋ

미안하다 이거 보여주려고 어그로 끌었다. 최근 DTO 관련된 글을 하나 읽었다. 원글 : https://medium.com/@bubu.tripathy/dto-free-java-ee70c43b5ad5 DTO-Free Java Moving Beyond DTOs to Enhance Application Design medium.com 해당 글에서 필자는 기존 DTO의 문제점을 제기하고 그에 대한 해결 방안을 제안하였다. 필자가 말하는 기존 DTO의 문제점 1. DTO는 비지니스 로직 없이 단순 데이터만 가지고 있어 해당 DTO를 다루는 곳에서 중복 코드가 발생할 수 있다. 2. 도메인 객체나 비즈니스 로직이 변경될 경우 DTO에도 동일한 수정 작업이 필요하다. 3. 대규모 어플리케이션에서 DTO의 증가함에 따..

BackEnd/Java 2024.03.17