분류 전체보기
CHAPTER 04.팩토리 패턴
팩토리 패턴 이해를 위한 간단한 문제 제안피자를 만드는 아래와 같은 코드가 있다고 가정해보겠습니다.public class PizzaStore { public Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } pizza.prepare();..
CHAPTER 03.데코레이터 패턴
데코레이터 패턴 이해를 위한 간단한 문제 제안 2022년 스타버즈 커피는 커피 브랜드를 대표하는 브랜드로 성장해있습니다. 1971년 스타버즈는 지금처럼 회사가 커질줄 몰랐고 메뉴도 지금처럼 많지 않았습니다. 사업을 시작할 무렵에는 아래와 같은 설계 구조로 이뤄져 있습니다. Beverage는 음료를 나타내는 추상클래스입니다. 매장에서 판매되는 모든 음료는 이 클래스의 서브클래스가 됩니다. Beverage의 cost()메소드는 추상 메소드입니다. 서브클레스에서는 이 메소드를 구현해야합니다. Beverage의 description이라는 인스턴스변수는 각 서브클래스에서 설정되며 커피에 대한 설명 정보가 문자열로 저장됩니다. description이라는 변수 정보는 getDescription() 메소드를 통해 정보..
CHAPTER 02.옵저버 패턴
옵저버 패턴 이해를 위한 간단한 문제 제안 독자에게 기상 조건인 온도, 습도, 기압 3가지의 변화를 감지하는 시스템을 만들라는 요구사항이 들어옵니다. 위의 3가지 항목들은 실시간으로 갱신되야 합니다. 디스플레이를 손쉽게 추가할 수 있어야 합니다.이 기기는 다른 추가사항 또한 바로 넣을 수 있도록 확장 가능해야 합니다. 요구 사항을 좀 더 자세히 설명해보겠습니다. 저희들이 구현해야하는 것은 WeatherData 객체입니다. 가상 스테이션은 습도, 온도, 기압 센서로부터 데이터를 받습니다. 이때 변경되는 데이터는 실시간으로 받기 때문에 WeatherData객체는 실시간으로 데이터를 변경해줘야합니다. WeatherData객체는 가상 스테이션과 통신해서 기상 데이터를 가져옵니다. WeatherData객체는 디스..
CHAPTER 01.디자인 패턴 소개와 전략 패턴
전략 패턴 이해를 위한 간단한 문제 제안 전략패턴을 이해하기 위해 간단한 문제를 먼저 제시해보도록 하겟습니다. “SIMUDuck”이라는 오리 게임을 만들기 위해 오리라는 객체를 정의하고 오리를 상속받아 도메인에 맞는 오리를 생성하는 설계 구조입니다. 이런 설계 상황에서 기획자의 요구에 의해 Duck이라는 객체에 Fly()라는 메소드를 추가 받아야 하는 요구사항이 들어온것입니다. 개발자는 상속을 사용하여 구현한 상태에서 모든 오리는 날수 있다고 생각하여 Fly()라는 메소드를 추가하게 됩니다. 근데 이런 상황에서 만약 모형 오리라는 클래스를 추가하게 되면 날지 못하는 오리들도 날게 되는 기이한? 오류가 발생하게 됩니다. 이처럼 전략패턴은 상속에 대한 부정적인 관점으로 인터페이스 기반 설계와 구현을 지향합니..
CHATER 00.이 책을 읽는 방법
이 책을 읽는 이유와 포스팅 하는 이유 이 책은 디자인 패턴에 대해 설명하는 책들입니다. 개인적으로 많은 멘토분들과 동료들이 이 책을 읽으라고 추천을 해주셨습니다. 이 카테고리의 포스팅된 글들은 제가 까먹고 기억하기 위해서 작성하는 목적도 가지고 있지만 구글링을 통해 들어와서 정보를 빠르게 필요로 하신 분들을 위해서이기도 합니다. 이 책의 저자는 에릭 프리먼과 엘리자베스 롭슨입니다. 에릭 프리먼은 월트 디즈니 온라인 CTO를 역임하고 현재는 WickedlySmart에서 책과 동영상 콘텐츠를 창작하는 일을 하는 프로입니다. 또한 헤드 퍼스트 시리즈를 만든 사람 중 한명입니다. 엘리자베스 롭슨은 소프트웨어 엔지니어 저자로서 WickedlySmart의 공동창업자로 예일대학교에서부터 기술적인 분야에 열정을 품고..
컨테이너 기반(Docker) MySQL 서버 InteliJ 연동 오류 처리
InteliJ IDE에서 DB 연동 중 아래와 같은 오류가 발생했다. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server 당시 나의 오류 환경 SpringBatch 테스트를 위한 DB가 필요한 상황이었다. 당시 오류 환경은 아래와 같았다. Local에서 MySQL을 설치한 상태였다. (외부 접근 Port번호 3306 사용중) 컨테이너 Server(MySQL)를 동작시킨 상황이었다.(외부 접근 Port번호 3307:3307) 사용 위의 사진처럼 Port번호를 3307로 설정해도 접근이 안되는 문제가 발생했다. 처음 연동시에는 도커의..
Spring의 API 예외 처리
개요 이전 글에서 오류와 예외처리에 대한 설명을 진행했다. https://hyeophyeop.tistory.com/150 이전 글은 BaseController에 대한 설명이었으며 개발자는 편하게 error 페이지를 관리할 수 있다는것이 핵심이었다. 하지만 API의 예외 처리는 다르다. HTML 페이지는 4xx, 5xx 오류 페이지만 있으면 대부분의 오류 문제를 해결할 수 있으나 API는 그렇지 않다. 왜냐하면 API는 각 서버와 연동을 하기 때문에 오류 응답 스펙이 다향하며 JSON 데이터로 응답을해줘야 하기 때문이다. 이 글에서는 복잡한 API 예외 처리를 효율적으로 처리하기 위한 ExceptionResolver에 대햇 설명하며 해당 내부기술이 어떻게 동작하는지와 사용법에 대해 설명한다. Spring의..
1.Spring Batch 소개
1.개요(Spring Batch는 왜 등장했는가)자바 기반의 표준 배치 기술이 존재하지 않기 때문에 등장했다.자바에는 Network, TCP, UDP, Thread 등 개발에 필요한 기본 기술들이 JSP(Java Specification Request)에 명시되어있다.하지만 배치와 관련된 기술은 JSR에 명시되어있지 않고 이것이 Spring Batch의 등장 배경이 되었다.그렇기 때문에 재사용 가능한 자바 기반 배치 아키텍쳐가 필요하게 되었다.그렇기에 Spring Batch가 등장하였다.Spring Batch는 SpringSource(현재는 Privotal)와 Accenture(경영 컨설팅기업) 두 기업의 합작품이다.Accenture-배치 아키텍쳐를 구현하면서 쌓은 기술적 경험 노하우를 보유한 회사Spr..
Spring의 예외처리와 오류페이지
예외 처리랑 오류 페이지를 만드는 작업을 왜 해야 하나요? 웹 사이트 이용시 비정상적인 접근을 할 경우 서버에서 오류 페이지를 반환받은 경험이 있을것이다. 위와 같은 상황에서 개발자는 사용자에게 정상적인 요청이 이루어지지 않은 이유를 알려줘야 할 필요가 있다. Spring은 이러한 오류처리를 편리하게 제공한다. 이 글에서는 Spring의 예외 처리와 오류페이지에 대해 설명하며 이러한 동작을 할 때 내부원리의 동작과정에 대해서 설명한다. 스프링의 예외처리는 어떻게 진행되나요? 스프링은 ErrorPage를 자동으로 등록한다. src/main/resources/error 경로의 HTML 파일을 오류 반환 HTML로 설정한다. 파일 이름을 오류 번호대로 해야한다. ex:)300.html, 3xx.html, 40..
Spring의 필터와 인터셉터
필터와 인터셉터란? 인증과 보안이 필요한 사이트에서 해당 서비스를 사용할 수 없어야한다. 스프링에서는 인터셉터와 필터를 통하여 검증로직을 작성할 수 있다. 필터는 서블릿 자체의 기술이며 스프링이 서블릿 기반의 기술이기 때문에 필터를 사용할 수 있는것이다. 인터셉터는 스프링 자체의 기술이다. 즉 스프링은 서블릿 기반의 기술이므로 검증을 할 수 있는 수단이 2가지가 있는것이다. 필터와 인터셉터의 흐름 필터와 인터셉터의 전체적인 흐름은 아래와 같다. HTTP요청 -> WAS -> Filter -> Servlet -> Intercepter -> Controller 필터는 서블릿에 도달되기전에 검증로직을 수행한다. 인터셉트는 컨트롤러에 도달하기전에 검증로직을 수행한다. 필터는 아래와 같은 인터페이스를 통해서 구현..
Spring의 쿠키,세션
1. 개요 이번 글에서는 고객들의 로그인 상태를 지속적으로 유지시키기 위한 방법을 다룬다. 고객들의 정보를 지속적으로 유지시키기 위해서는 쿠키의 개념이 필요하다. 쿠키의 고질적인 문제를 파악하고 이를 해결하기 위한 세션의 등장개념을 이해하도록 하고 스프링에서의 세션을 어떻게 적용하는지 확인해보자 쿠키가 생성되는 전체 흐름 서버에서 로그인에 성공하면 HTTP 응답을 통해 Server에 접속한다. 접속에 성공한 이후 현재 쿠키가 존재한다면 해당 쿠키를 반환하고 없을 경우 Server에서 생성해서 보내준다. 클라이언트가 쿠키를 가지고 있다면 Server에서는 별도의 login 로직을 거치지 않기 때문에 속도, 성능 측면에서 이점을 가져갈 수 있다. 이런 쿠키에는 2가지의 종류가 있다. 영속 쿠키: 만료 날짜를..
Spring의 Bean Validation
1.Bean Validation 소개 이전 Validation에 대한 글을 작성할 때 검증 로직이 굉장히 복잡한것을 알 수 있다. https://hyeophyeop.tistory.com/145 Spring의 Validation이란 Spring_Boot_Study/4.spring-MVC2/message at master · NamHyeop/Spring_Boot_Study GitHub - NamHyeop/Spring_Boot_Study: Spring 공부를 하며 기록한 자료들입니다. Spring 공부를 하며 기록한 자료들입니다. C.. hyeophyeop.tistory.com 이런 복잡한 로직을 Spring에서는 Bean Validation을 통해 간단하게 검증을 할 수 있다. 아래의 복잡한 이전 코드와 S..
Spring 메시지, 국제화
Spring_Boot_Study/4.spring-MVC2/message at master · NamHyeop/Spring_Boot_Study GitHub - NamHyeop/Spring_Boot_Study: Spring 공부를 하며 기록한 자료들입니다. Spring 공부를 하며 기록한 자료들입니다. Contribute to NamHyeop/Spring_Boot_Study development by creating an account on GitHub. github.com 1.메시지 국제화 소개 메시지는 아래와 같이 Message.propertis에 내용을 관리하면서 수정에 용이하게 만드는것을 의미한다. //messages_kr.properties item=상품 item.id=상품 ID item.itemN..
Spring의 Validation이란
Spring_Boot_Study/4.spring-MVC2/message at master · NamHyeop/Spring_Boot_Study GitHub - NamHyeop/Spring_Boot_Study: Spring 공부를 하며 기록한 자료들입니다. Spring 공부를 하며 기록한 자료들입니다. Contribute to NamHyeop/Spring_Boot_Study development by creating an account on GitHub. github.com 1.검증이 필요한 이유 사용자가 잘못된 입력값을 넣었을 경우 정상적인 요청인지 검증을 해야한다. 만약 검증을 안할 경우 아래와 같은 상황이 발생할 수 있다. 만약 이름 입력란에 공백을 넣고 입력했는데 이름이 입력되지 않았습니다가 출력이 ..
Spring MVC 구조 및 구현
개요 얼마전에 네이버에서 기술 면접을 보게 되었는데 질문으로 MVC 패턴에 대해서 설명해달라는 질문을 받게 되었다. 설명은 했으나 너무 오래전에 학습해서 내가 알고있는 전부를 제대로 전달하지는 못한거 같아서 글로 다시 정리해볼려고 한다. 1.스프링 MVC 전체 구조 스프링의 MVC 구조는 간단하게(?) 아래와 같은 구조로 이루어져있다. 먼저 Http 요청이 이루어진다 이후 DispatcherServelet의 doDispatch()가 실행된다. 현재 스프링 부트의 핸들러 매핑 정보를 탐색한다. handler 동작을 수행해줄 Adapter의 정보를 보고 handler 동작을 수행할 수 있는 Adapter가 존재한다면 반환하게 된다. 다시 DispatcherServlet으로 돌아온뒤 3번에서 받아온 Contr..
스프링 빈 기능
스프링 컨테이너와 스프링 빈 1.스프링 컨테이너 생성 목표 Spring의 @Bean 기능을 사용하여 스프링 컨테이너에 등록하는 연습을 해보자 Spring의 ac.getBean(), ac.getBeanDefinitionNames(), ac.getBeanDefinitionName() 기능을 사용해보자 Configuration을 사용해 Contatiner에 Bean을 저장하는 방법을 수행해보자 //AppConfig.class import bluish_Community_Projcet.bluish.discount.DiscountPolicy; import bluish_Community_Projcet.bluish.discount.RateDiscountPolicy; import bluish_Community_Projc..
Spring의 종류와 장점
1.스프링이란? 스프링의 종류 스프링 프레임워크(지원 기술 대상을 알아보자) 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타 웹 기술 : 스프링 MVC, 스프링 WebFlux 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원 기술 통합 : 캐시, 이메일, 원격 접근, 스케쥴링 테스트 : 스프링 기반 테스트를 지원한다 언어 : 코틀린, 그루비 스프링 부트란? 스프링을 편리하게 사용할 수 있도록 지원한다. 단독으로 실행할 수 있는 스프링 애플리케이션을 생성한다. Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치할 필요가 없다. 손쉬운 빌드 구성을 위한 starter를 제공한다. 스프링과 외부 라이브러리를 자동으로 구성해준다. Spring과 타 라이브러리의 버전을 전부..
python mediapipe 설치 오류 해결 방법(media pipe install ERROR: Could not find a version that satisfies the requirement mediapipe (from versions: none))
오류정보 media pipe install ERROR: Could not find a version that satisfies the requirement mediapipe (from versions: none) media pipe install ERROR: Could not find a version that satisfies the requirement mediapipe (from versions: none) 사용환경 Mac M1 Pro 급하신 분들을 위한 해결방법 1.python 버전을 3.7번대로 다운 받는다. 2.intel 기반의 python을 사용한다. 해결과정 처음에는 구글링을 했지만 답이 나오지 않았습니다. "pip install mediapipe" does not work · Issue ..
No Properties 오류
JSON을 사용하여 API를 개발하던 중 아래와 같은 오류를 만났다. 보통 DTO 파일에 Getter, Setter가 추가가 안되어 있어서 발생하는 오류다. DTO 파일 또는 getter나 setter가 사용되는 코드에 추가가 되어있는지 확인해야한다. ps.다음부터는 no properties가 보이면 바로 lombok(@Getter or @Data)을 추가해서 오류를 해결하면 좋을거 같다.
NoClassDeFoundError 해결 방법
NoClassDeFoundError JPA 환경설정 중에 NoClassDeFoundError가 발생하였다. Maven 환경 기반에서 설정 중이었다. 11월 29, 2021 2:19:15 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...] 11월 29, 2021 2:19:16 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.3.10.Final} 11월 29, 2021 2:19:16 오후 org.hibernate.cfg.Enviro..
실무 JUnit Test에서 ConcurrentHashMap을 사용해야 하는 이유
ConcurrentHash Map vs HashMap 개발을 하다 보면 DB에 값을 저장하기 전에 메모리 영역에서 값을 저장하고 테스트해야 할 때 가 있다 이때 아래와 같이 간단 한 맴버를 저장하는 MemoryRepository가 있다고 가정해보자 안에는 맴버의 아이디 값과 멤버를 저장하는 HashMap 구조를 사용했다. import java.util.HashMap; import java.util.Map; public class MemoryMemberRepository implements MemberRepository{ private static Map store = new HashMap(); @Override public void save(Member member) { store.put(member.g..
level2_삼각달팽이
문제 https://programmers.co.kr/learn/courses/30/lessons/68645 코딩테스트 연습 - 삼각 달팽이 5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] programmers.co.kr 접근방법 1) 접근 사고 인덱스값을 조절해주면 해결하면 됩니다. 탐색시 방문한 곳을 또 방문해주면 반복문을 탈출하게 설정해주었습니다. 2) 시간 복잡도 O(n^2) 3) 실수 4) 배운점 5) PS 정답 코드 #include using namespace std; const int MAX = 1001; int board[MAX][MAX]; bool visited[M..
좋은 객체 지향 설계의 5가지 원칙(SOLID)
개요 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리한것 1.SRP: 단일 책임 원칙(single responsibility principle) 한 클래스는 한나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적은 단일 책임 원칙을 잘 따르는 것이다. 예) UI변경, 객체의 생성과 사용을 분리 2.OCP: 개방-폐쇄 원칙 (Open/closed principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 위의 문장은 모순이 존재한다. 다형성을 활용해서 생각해보자 인터페이를 구현한 새로운 클래스를 만들어서 새로운 기능을 구현해보자 ..
4.트랜스포트 프로토콜(세그먼트, 포트번호, well-known port, TCP 연결 설정, TCP 데이터 송수신, TCP 흐름제어, 윈도우 흐름제어, 재전송, Jacobson/Karels 알고리즘, 데이터 경계 표시, TCP 옵션, UDP, UDP헤..
네 번째 쳅터에서는 인터넷의 트랜스포트 계층 프로토콜인 TCP와 UDP에 대해 설명한다. 트랜스포트 계층 IP 계층의 도움을 받아 종점간(end-to-end) 호스트에서 실행되는 프로세스들이 안정적으로 메시지를 송수신 하도록 도와주는 역할을 한다. 인터넷의 트랜스포트 계층 프로토콜에는 TCP와 UDP가 있다. TCP와 UDP는 각각 연결형과 비연결형 서비스를 제공한다. 엡 브라우저는 기본적으로 TCP를 사용하고 비디오 스트리밍에서는 UDP를 사용한다. TCP는 신뢰성 있는 통신 환경을 제공하고 UDP는 TCP보다 간단한 메시지 전달 기능만 제공하는데 이들의 차이는 뒤에서 자세히 설명한다. 앞에서 IP 프로토콜을 설명했는데, IP 프로토콜은 OSI 계층 3의 기능을 수행하며 네트워크 주소를 사용하여 패킷을..
3.라우팅(포워딩, 링크상태 라우팅, Autonomous System, OSPF, 도메인간 라우팅, 도메인내 라우팅, BGP, CIDR, 방송형라우팅, 멀티캐스트 , MBONE, Mobile 네트워크의 라우팅, AD HOC 네트워크의 라우팅, 혼잡제..
3.라우팅 인터넷의 확장성 등장 배경은 인터넷 속도의 확장성이다. TCP/IP 프로토콜은 1960년대에 만들어진 오래된 기술이다. 당시의 네트워크 속도에 비해 현재 인터넷은 수백 Gbps으로 동작하며 접속된 컴퓨터 수도 수억대에 이른다. 그러나 지금까지도 TCP/IP가 잘 동작하고 있으며 확장성이 좋은 핵심 이유는 두 가지를 들 수 있는데, 첫 번째는 IP 프로토콜이 단순하다는 것과 라우팅 프로토콜이 확장성이 매우 좋다는 것이다. 통신 전송 속도가 빨라져서 효과적으로 처리 속도가 길어졌지만 인터넷은 잘 동작하고 있다. 또한 인터넷에 연결된 라우터의 수가 급격히 늘어나도 안정적으로 인터넷이 동작하고 있다. 더불어 통신 링크가 끊어지거나 라우터가 고장이 나더라도 전체 인터넷은 중단 없이 동작할 수 있게 되었..
2.IP 프로토콜(인터넷계층, BestEffort, IP패킷구조, IP 주소, IPv6, 특수주소, 메시지 분할 전송, path MTU, DHCP, 고정IP, NAT, 포트번호, ARP/RARP , ICMP, IGMP, 서브네팅,)
인터넷 계층 인터넷 계층은 인터넷 프로토콜(IP)을 수행하는 계층으로 하위(sub) 네트워크에 무관하게 IP 패킷을 호스트(컴퓨터) 사이에 전달하는 기능을 수행한다. OSI 7 계층 관점에서 보면 인터넷 계층은 주소(addresing)와 교환(Switching) 그리고 라우팅을 담당한다. IP는 비연결형 서비스로 동작한다. 따라서 IP에서는 각 패킷이 개별적으로 목적지를 찾아갈 수 있어야 하므로 IP 패킷은 송신자와 수신자의 주소로서 각각 32비트의 IP 주소를 항상 포함하고 있어야 한다. IP프로토콜은 인터넷 계층이라고도 한다. 3계층에 포함된다. 주의해야 할 개념은 교환(Switching)과 라우팅의 개념이 다르다는것이다. 교환(Switching)은 패킷이 들어오면 어디로 나갈지 찾아주는것이고 라우팅..
1.인터넷(TCP/IP, UDP, 프로토콜 모음집)
인터넷 인터넷 동작의 기본이 되는 TCP/IP 프로토콜의 주요 기능을 설명한다. TCP/IP 인터넷은 전 세계 컴퓨터들을 연결하고 있으며 통신 프로토콜로 TCP/IP를 사용한다. TCP/IP와 관련된 표준은 RFC(Request For Comments)이다.(권고 되는 표준 사항이며 강제성은 없다.) 인터넷에 관한 약속들이 담겨있다고 이해하면 된다. TCP/IP 프로토콜 개요 미국 국방성에서 1968년에 컴퓨터들간의 통신이 가능하도록 컴퓨터 통신 프로토콜을 만들었으며 이 때 TCP/IP가 만들어졌다. TCP/IP의 기본 프로토콜은 TCP(Transmission Control Protocol)와 IP(Internet Protocol)이며 이들은 각각 OSI 계층 4와 3계층 3의 기능을 수행한다. 인터넷은..
15732번-도토리숨기기
문제 https://www.acmicpc.net/problem/15732 15732번: 도토리 숨기기 첫째 줄에 상자의 개수 N(1 ≤ N ≤ 1,000,000)과 규칙의 개수 K(1 ≤ K ≤ 10,000), 도토리의 개수 D(1 ≤ D ≤ 1,000,000,000)가 주어진다. 그 후 K개 줄에는 A, B, C(1 ≤ C ≤ A ≤ B ≤ N)가 주어지며 A번 상자부터 www.acmicpc.net 접근방법 이 문제는 어떤 것을 탐색 기준으로 삼아야 할 지 어려웠던 문제였다. 탐색 기준은 "박스의 최대 길이"로 설정하여서 이분 탐색을 수행하였다. 박스의 최대 길이와 규칙에서 더 짧은 기준을 선정하여 check 함수 탐색의 right값을 설정하였다.(앞에서 부터 갯수를 세는 문제 조건) 그 이후 mid ..