일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 포인트클라우드
- Spring Batch
- Database
- 자바ORM표준JPA프로그래밍
- 파이썬
- Hibernate
- 알고리즘
- MySQL
- Java
- 논문
- 배달로봇
- 논문리뷰
- persistance context
- 딥러닝
- 자료구조
- 운영체제
- Python
- cartograhper
- 프로그래머스
- 이펙티브자바
- 자율주행
- 장애물인식
- 자바
- 네트워크
- JPA
- DeepLearning
- Jetson
- 디자인패턴
- 영속성컨텍스트
- 아두이노
- Today
- Total
목록분류 전체보기 (56)
제리 devlog
싱글톤 패턴이란? 인스턴스를 매번 생성하지 않고 최초에 생성한 객체를 공유하여 사용하는 패턴이다. 인스턴스 한 개로 여러 요청을 처리할 수 있다면 메모리상에서 효율적이며 객체의 추가적인 생성이 없으므로 성능이 빠르다. 하지만 하나의 객체를 공유한다는 점에 있어서 thread safe여부를 주의해야한다. 일반적으로 싱글톤 패턴은 생성자를 private로 선언하여 new키워드로 객체의 생성을 막고 정적 팩터리 메서드형태로 인스턴스를 반환한다. 방법1. synchronized method public class RemoteControl { private static RemoteControl remoteControl; private RemoteControl() { } public static synchroniz..
커맨드 패턴이란? 간단히 말하자면 커맨드 패턴은 요청을 객체의 형태로 캡슐화하여 처리하는 방식이다. 일반적으로 객체는 메서드를 통해 행동을 정의하지만, 행동 자체를 객체로서 표현한다는 의미이다. 만약, 전등을 객체로 표현하고 전등이 켜지는 행위는 아래와 같이 표현된다. public class Light { public void on() { System.out.println("전등 켜짐"); } } 커맨드 패턴에 따라 on()동작 자체를 객체로서 정의하면 아래와 같은 코드가 된다. public interface Command { void execute(); } public class Light { public void on() { System.out.println("전등 켜짐"); } } public cl..
Socket이란? socket은 application layer와 transport layer사이의 인터페이스역할을 담당하며 서로 다른 endpoint간 통신을 위해서 사용된다. Socket의 동작 과정 서버측 동작 과정 1. 서버는 socket를 만든다. 2. 서버에서 ip주소와 port를 지정하여 소켓에 바인딩한다. 3. 서버는 listen상태가 되어 클라이언트의 요청을 기다린다. 4. 클라이언트의 요청을 받아드리고 데이터 송수신을 위한 소켓을 생성한다. 5. 클라이언트와 데이터를 송/수신한다. 6. 연결을 종료한다. 클라이언트측 동작 과정 1. socket을 만든다. 2. 서버에게 요청을 보내 connection을 맺는다. 3. 서버와 데이터를 송/수신한다. 4. 연결을 종료한다. Java 프로그램..
중첩 클래스 중첩 클래스 : 다른 클래스 안에 정의된 클래스를 말함. 중첩 클래스는 자신을 감싼 클래스에서만 사용되어야 한다. 만약 다른 쓰임새가 있다면 톱 레벨 클래스로 만들어야 함. public class A { private class B{ ... } } 중첩 클래스의 종류 : 정적 맴버 클래스, (비정적) 맴버 클래스, 익명 클래스, 지역 클래스 정적 맴버 클래스를 제외한 나머지는 내부 클래스에 해당됨. 정적 맴버 클래스 //정적 맴버 클래스 public class A { private static class B{ ... } } 특징 1. 정적 맴버 클래스는 다른 클래스 안에 선언되고 바깥 클래스의 private맴버에도 접근 할 수 있다는 점을 제외하면 일반 클래스와 같다. 2. 정적 맴버 클래스..
서비스를 운영하면서 고려해야 할 중요한 문제는 장애 처리라고 생각한다. 이번 프로젝트로 장애 처리에 대한 지식을 조금이나마 얻어 갈 수 있었다. MSA구조에도 자주 사용된다는 서킷 브레이커를 적용해봤다. Redis서버에 장애가 생기면? redis서버에 장애가 생기면 위와 같이 서버에서 500 error가 발생하고 컨텐츠가 보이지 않는다. 별도의 설정을 하지 않았을 때 캐시 서버에 문제가 생겼을 때 서비스가 다운됐다. 기존 캐시 구조는 다음과 같다. 1. 클라이언트로부터 api요청이 들어온다. 2. redis에 캐시가 저장되어 있는지 확인한다. 2-1. 캐시가 있다면 캐시 값을 반환한다. 2-2. 캐시가 없다면 3으로 이동한다. 3. 캐시가 없는 경우 DB에서 조회한다. 위와 같은 구조에서 global c..
이 프로젝트를 진행하면서 사용자의 트래픽에 대해 어떻게 처리해야할지 고민했다. 그런 이유로 서버를 쉽게 확장할 수 있는 CI/CD구조도 고민하게 되었고 자연스럽게 서버 성능에 대해서도 고민하게 되었다. 프로젝트를 진행하며 부하테스트라는 것도 알게 되었는데 부하 테스트를 통해 트래픽을 어느 정도 처리할 수 있는지 정량적인 수치를 알 수 있었다. 부하 테스트 랭킹 카테고리의 아이템을 페이징하여 조회하는 API를 호출한 결과이다. 40명의 가상 유저를 만들어 테스트 해봤을 때 TPS(초당 트랜잭션 수)가 13에 불과했다. select id, brand, brand_url, category, img, modified_date, product_id, product_name, product_url, rank fro..
이번 프로젝트에 CI/CD를 도입하면서 많은 고민과 시행착오를 겪었다. 왜 처음 결정한 구조에서 변경을 했는지, 어떻게 변경을 했는지 정리해보았다. CI/CD를 도입한 이유 CI는 사전적인 의미로 지속적인 통합이다. 바꿔말하면 개발자가 코드를 작성하고 합치고 빌드하고 테스트하는 과정을 일컫는다. 이 과정이 수동으로 진행되면 코드를 작성하고 합칠 때마다 빌드와 테스트를 수동으로 진행해야 한다. 이런 귀찮은 과정을 github에 push 하기만 해도 전부 이뤄지게 자동화할 수 있다. CD는 사전적 의미로 지속적인 배포이다. CI 과정 뒤에는 CD 과정이 필요하다. 배포 프로세스도 수동으로 작업할 필요 없이 CI와 연동하여 자동화시키면 서버를 배포하는 과정을 수동으로 하지 않아도 된다. 내가 CI/CD를 도입..
인터페이스 : 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 전달하는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다. 인터페이스를 잘못 사용한 예 )상수 인터 페이스 상수 인터페이스란 메서드 없이 static final 필드로만 가득한 인터페이스를 말한다. 클래스에 정규화된 이름을 쓰는걸 피하고자 종종 사용한다고함 public interface PhysicalConstants { //아보가도르 수(1/몰) static final double AVOGADROS_NUMBER = 6.002_140_857e23; //_기호는 숫자 리터럴의 값에는 영향을 주지않고 읽기는 훨씬 간편하게 해줌 //볼츠만 상수 (J/K) static final double BO..