본문 바로가기

728x90

전체 글

[디자인 패턴] 프로토타입 패턴 /* 프로토타입 패턴 (Prototype Pattern) */ 객체가 있고 그 객체의 정확한 복사본이 필요한다면 우리는 새 객체를 생성하고 기존 객체의 모든 필드 값을 새 객체에 넣을 것이다. 이러면 문제가 없지만 기존 객체의 필드를 외부에서 볼 수 없는 경우가 발생한다. 또한, 객체의 복제본을 생성하려면 객체의 클래스를 알아야 하므로, 해당 클래스에 의존하게 된다. 이러한 문제점들을 막기 위해 프로토타입 패턴을 이용한다. 프로토타입 패턴은 clone 메서드를 사용한다. /* 프로토타입 객체 생성 */ 방법은 여러가지가 될 수 있다. 나는 프로토타입 인터페이스 정의를 통해 구현을 하겠다 // 프로토타입 인터페이스 interface Prototype { Prototype clone(); } // 구체적 프.. 더보기
[서버] RESTful API 프로젝트를 구할 때 인터뷰 형식으로 RESTful API에 대해 물어봤었다. 맞는 대답을 하긴했지만 스스로 평가하기에 답변이 만족스럽지 못해 공부를 하고 블로그를 작성해본다 REST API 관련 글은 이전에 썼던 게시글을 참고하자 https://ewanjee.tistory.com/entry/RESTful-API /* RESTful API */ REST API와 RESTful API는 비슷해 보이지만, 미묘한 차이가 있다. REST API는 REST 아키텍처 원칙을 따르는 API를 말한다. RESTful API는 REST 아키텍처 원칙을 완벽하게 준수하는 API를 의미한다. /* RESTful 기준 */ 클라이언트, 서버 및 리소스로 구성. 요청이 HTTP를 통해 관리되는 클라이언트-서버 아키텍처 스테이트.. 더보기
[Git] 브랜치 전략 - Git Flow /* 브랜치 전략 */ 협업 프로젝트를 하기 위해서는 브랜치 전략을 설정하는 것이 매우 중요하다. 충돌을 조기에 발견하고 해결할 수도 있고 버전 관리, 롤백 같은 작업을 편리하게 한다. /* Git Flow */ Git Flow 브랜치 전략은 릴리즈 버전 관리를 간편화하는데 용이하다. 위의 그림을 보면 5가지의 브랜치가 보인다. (회사마다 상이할 수 있음) feature, develop, release, hotfixes, master /* master (main) 브랜치 */ master 브랜치는 릴리즈 될 프로덕션을 포함하는 브랜치이다. 그림의 Tag (번호)는 버전 정보이다. master 브랜치는 안정화된 기능에 대해서만 배포가 이루어져야 한다. /* develop 브랜치 */ 말 그대로 개발을 위한.. 더보기
[디자인 패턴] 싱글톤 패턴 (Singleton Pattern) /* 싱글톤 패턴 */ 싱글톤 패턴이랑 단 클래스의 객체를 하나만 만들기 위한 코드 패턴이다 코드를 하다보면 우리는 하나의 객체만 사용할 때가 있다. (DB에 연결하기 위한 Connection 클래스 - 여러 클래스에서 Connection 클래스를 이용할때마다 객체를 여러번 만들면 메모리 낭비가 심하다) /* 이해를 위한 예시 */ public class Main{ public static void main(String[] args){ Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2); //true } } getInstance() 메서드를 이용해 객체를 불러온다.. 더보기
[JAVA] 자바 8, 11, 17, 21 그리고 22 업데이트 최근 (3/19/2024) JDK22가 등장했다. 먼저 자바 8, 11, 17, 21부터 정리를 하고 22에 어떤 기능이 바뀌고 추가 되었는지 설명하겠다. /* 자바 8 - 2014년 출시 */ 람다 표현식 & Functional Interface 스트림 API 날짜와 시간 API (LocalDate, LocalDateTime, ...) Optional 인터페이스의 디폴트 메소드 /* 자바 11 - 2018년 출시 */ Predicate String에 새로운 메소드 추가 isBlank() : 문자열 비어있거나 공백만 포함했으면 true repeat(int n) : n개만큼 문자열 반복해서 붙여서 반환 strip() : 문자열 앞, 뒤 공백 제거 stripLeading() : 문자열 앞 공백 제거 str.. 더보기
[Docker] 도커란 무엇인가 /* 도커를 쓰는 이유 */ 처음에 도커라는 개념이 너무 이해가 안됐다. 도커를 쓰는 이유에 대해 알면 개념을 잡는 데 도움이 많이 될 것이다. 먼저, 공동프로젝트로 웹 개발을 한다고 생각해보자. 프론트 개발자 1명, 백엔드 개발자 1명이다. 프론트는 자바스크립트를 쓰고 백엔드는 자바를 쓴다. 어느날, 두 명은 프론트, 백엔드를 같이 돌려서 서로 통신이 잘 되는 지 테스트를 해보고 싶다고 한다. 하지만, 프론트의 컴퓨터에는 자바가 깔려있지 않고, 백엔드의 컴퓨터에는 자바 스크립트가 깔려있지 않다. 그러면 테스트를 위해서는 프론트는 자바를 다운로드 해야하고 백엔드는 자바 스크립트를 다운로드 해야한다. 거기서 더해서 백엔드는 nodejs를 다운로드 해야하고 프론트엔드는 MySQL을 다운로드 할 필요도 있다,.. 더보기
[JAVA] Arrays.sort Collections.sort 알고리즘 차이 /* Arrays.sort, Collections.sort */ Arrays.sort() 는 Array를 정렬해준다. Collections.sort()는 ArrayList, LinkedList 같은 List 인터페이스를 정렬해준다. /* Arrays.sort */ primitive 타입인 경우 Arrays.sort() 를 살펴보니 듀얼피봇 퀵정렬(Dual-Pivot Quicksort)을 사용한다고 되어 있다. Dual-Pivot Quicksort는 Quicksort와는 다르게 Pivot을 2개를 두고 3개의 구간으로 만들어 Quicksort를 진행한다고 한다. 이 때 Pivot을 설정할 때는 Median을 이용한다고 알고 있다. 시간복잡도는 O(n log(n))으로 나와있다. reference(참조) 타.. 더보기
[JAVA] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy) /*깊은 복사와 얕은 복사*/ 얕은 복사 (Shallow Copy)는 주소 값을 스택 영역에 복사한다. 깊은 복사 (Deep Copy)는 실제 값을 힙 영역에 복사한다. /* 얕은 복사 */ Person person = new Person("Person1",20); Person newPerson = person; newPerson.setName("NewPerson"); newPerson.setAge(1); System.out.println(person); // NewPerson, 1 System.out.println(newPerson); // NewPerson, 1 newPerson의 객체는 스택에 쌓인다. 하지만 newPerson은 person과 같은 메모리 주소 값을 참조한다. 따라서 newPerso.. 더보기

728x90