TIL101 [Java] Effective Java 3/E item 7~9 item 7: 다 쓴 객체는 참조 해제하라 public class Stack { private Object[] stack; private int size = 0; public Stack() { stack = new Object[1000]; } public void push(Object e){ /// 구현 내용 } public Object pop(){ if(size == 0){ throw new EmptyStackException(); } return stack[--size]; } // 기타 구현 내용 } 예를 들어 위와 같이 stack을 구현하였을 때, 내용에서 메모리 누수가 발생하는 곳은 pop() 메소드를 실행시켰을 때, 논리적인 개념으로는 stack의 가장 윗 부분의 객체를 꺼내서 사용했다지만 실제.. TIL/Java 2023. 6. 13. [AWS 2023 Summit] 오픈소스 데이터베이스로 탈 오라클 최근에 AWS 2023 Summit의 2번째 날에 참가할 기회가 있었는데, 이 때 본 내용 중 가장 흥미로웠던 세션에 대해 소개해보고자 한다. 글 자체는 행사(4월 말 경) 끝나고 직후에 거의 작성해놨는데, 정리해서 올리는데 너무 오래 걸렸다...ㅎㅎ 오픈소스 데이터베이스로 탈 오라클 온프레미스로 떠있던 상용 데이터베이스 데이터를 클라우드 데이터베이스로 마이그레이션 이를 진행하기 전까지의 고민에 대한 이야기 데이터 베이스 트렌드 프론트↔서버↔(큐 캐시 메시지) ↔ 데이터 베이스 기존에는 oracle과 같은 RDBMS aws로 마이그레이션 된 경우 dynamo db가 핵심 1.자체 관리형 → AWS 관리형 다른 클라우드와 연계가 쉽다 운영부담 감소 캐시 및 영구 인메모리 데이터를 활용 스케일링 문제 해결 .. TIL/AWS 2023. 6. 12. [Java] Effective Java 3/E item 4~6 item4: 인스턴스화를 막으려거든 private 생성자를 사용해라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰는 설계X 하지만 생성자를 명시하지 않으면 자동 생성되기에, private 생성자를 만들어 인스턴스화를 막자 이러한 방법은 상속을 불가능하게 하는 효과도 존재 Plus) 추상 클래스로 만드는 것으로 인스턴스화를 막을 수 없음. 왜냐하면 하위 클래스를 만들어 인스턴스화할 수 있기 때문 + 상속하여 사용하라는 의도로 착각될 수 있음 item5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 하나 이상의 자원에 의존하는 클래스를 만들 때, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱클톤 방식이 적합하지 않음 인스턴스를 생성할 때 생성자에 필요한 자원을.. TIL/Java 2023. 5. 28. [Java] Effective Java 3/E item 1~3 Item1: 생성자 대신 정적 팩토리 메소드를 고려하라 클래스 인스턴스를 얻는 전통적인 수단는 public 생성자 이와 별도의 수단으로 클래스는 정적 팩토리 메소드를 제공할 수 있음 정적 팩토리 메소드가 public 생성자에 비해 가지는 장단점 장점 이름을 가질 수 있음 Ex) BigInteger(int, int, Random) vs BigInteger.probablePrime 호출될 때마다 인스턴스를 새로 생성하지 않아도 됨 생성 비용이 큰 객체가 자주 요청되는 상황이라면 성능적으로 좋음 반복되는 요청에 같은 객체를 반환하는 식의 정적 팩토리 방식의 클래스는 인스턴스 통제할 수 있음. 이를 통해 클래스를 싱글톤으로 만들 수도, 인스턴스화 불가로 만들 수도 있음 반환 타입의 하위 타입 객체를 반환할 수 .. TIL/Java 2023. 5. 26. 스프링 프록시 팩토리 💡 프록시(Proxy) 란? 클라이언트가 실제 사용하려는 대상인양 요청을 받아 처리하는 역할. 프록시에게 요청을 넘겨받아 최종 처리하는 오브젝트는 타깃(Target). 타깃과 프록시인지 클라이언트가 구별할 수 없어야 하기에 둘은 같은 인터페이스를 확장해야 함. 프록시는 사용 목적에 따라 2가지로 나뉨 부가적인 기능 부여 ⇒ 데코레이터 패턴 접근 제어 ⇒ 프록시 패턴 프록시 패턴 객체 생성은 비용 ⇒ 최소한, 필요 시점까지 미루는게 좋음 타깃에 대한 접근권한 제어 가능 캐싱 프록시의 단점 프록시가 멤버변수로 타깃 오브젝트 가지기에 타깃 오브젝트에 종속적 똑같은 기능 수행하는 프록시라도 여러 타깃에 적용하려면 타깃의 갯수 만큼 프록시 생성해야 하기에 코드 중복 발생 프록시를 사용하지 않는 메소드에도 타깃으로.. TIL/Spring & Spring Batch 2023. 5. 24. Inner Class로 DTO 관리 프로젝트 내 VO 혹은 DTO 패키지 안에 필요할 때마다 Class파일을 생성하면 DTO 파일들이 마구마구 늘어난다. 여기서 파생되는 문제점들은.. 부분적으로 중복되는 파일 갯수 자체가 많아지고 보기에 안좋다. 더 이상 ClassName이 중복되지 않는 DTO를 만들기가 어려워집니다. 필드들이 겹치는 DTO로 대충 Response를 내리다보니 Over-Fetching을 하게됩니다. Inner Class로 DTO를 관리한다면 조금 더 깔끔한 패키지를 만들 수 있고, DTO ClassName을 정하는게 수월해진다. 그래서 Inner Class로 DTO를 관리하는 것이 좋지 않나? 라는 생각으로 이러한 방법을 검토해보았다. 예시 코드 @Getter @NoArgsConstructor(access = Access.. TIL/TIL 2023. 5. 10. Lombok @Builder vs @Accessor vs Setter 서론 최근 스프링 개발할 때 Lombok의 @Builder 어노테이션을 많이 쓰고 있는데, 아무리 생각해도 기존의 방식인 get/set 방식이랑 비교해서 너무 편해지고 가독성도 좋기에 분명 성능의 일부를 포기하고 이러한 장점을 얻었을 것이라는 생각이 자연스럽게 들었다. 그렇지만 Setter를 활용하는 것은 코드의 가독성도 해치고 무엇보다 너무 귀찮다. 검색하던 와중 이러한 불편함을 해결하는 @Accessors에 대한 존재도 알 수 있었다. 그래서 @Builder 나 @Accessors 같이 편하게 만들어주는 요소들은 성능의 일부를 포기하는 것이 정말 맞나? 라는 답을 찾기 위해 테스트를 수행하고 결과에 대한 이야기를 하기 전에 @Builder와 @Accessors에 대한 이야기를 먼저 해보고자 한다. @.. TIL/TIL 2023. 4. 21. [Lambda] 람다를 활용한 image resize 람다를 활용한 image resize 에 관한 내용은 많다 AWS 에서 자체 자습서 자료를 만들었을 정도로 대표적인 활용 방식인 것 같다. 근데 이제 내가 이를 구현하면서 마주했던 에러를 이야기 해보자한다. 문제 상황 1. 그냥 안됨 => 코드상의 문제이다, 파일 경로와 문법 실수를 유의하자 2. 무한 재귀 => 람다 트리거를 잘못 설정한 경우 s3 버킷을 하나로 사용하는데 조건을 이미지가 업로드 시로 통으로 걸어버리면 이미지 리사이징한 것을 올릴 때에도 트리거가 발동되어 무한으로 이미지 리사이징을 즐길 수 있다 내가 진짜 골치 아팠던것은 3. 이미지 리사이징이 진짜 가끔식 되고 대부분의 케이스에서는 제대로 동작하지 않는 경우였다. 코드는 아무리 뜯어봐도 문제가 없고 계속 테스트 해보다 보면 간간히 한 .. TIL/삽질 기록소 2022. 11. 2. [Debug]crontab으로 python 파일 실행 문제 상황 내가 원하는 것은 cron을 활용하여 매일 특정 시간에 추천 주제를 쌓아둔 DB에 접근하여 랜덤으로 값을 뽑아 다른 DB에 값을 써주는 작업을 하고 싶었다. 1. 앞서 말한 내가 원하는 작업을 python 파일로 작성 2. 이것을 crontab을 활용하여 실행 이렇게 진행하였는데 이제 1번은 완성되어 python3 main.py 이런식으로 동작시키면 원하는대로 동작하는 상황에서 crontab으로 main.py 를 동작시키면서 마주했던 에러들에 대해 작성해보자 한다. 해결 과정 내가 사용했던 ubuntu 기준으로 /var/log 의 syslog 파일에 cron관련 로그가 쌓였다. # CRON 관련 로그만 볼 수 있음 grep CRON syslog No MTA installed, discardin.. TIL/삽질 기록소 2022. 10. 27. [DB] 트랜잭션 격리 수준 & 부정합 이슈 부정합 이슈 Dirty Read: 다른 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있는 현상 Non-Repeatable Read: 하나의 트랜잭션내에서 동일한 SELECT 쿼리 실행시 항상 같은 결과를 보장해야하는 Reapeatable Read 정합성에 어긋난 것 Phantom Read: 읽을 때 쓰기 잠금을 거는 경우 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안보였다가 하는 현상 트랜잭션 격리 수준 Read Uncommitted 읽기 트랜잭션이 시작했을 때 다른 트랜잭션이 Update 가능 읽기 트랜잭션이 Update 중(un-commit)인 데이터를 조회할 수 있음 ⇒ 다른 트랜잭션이 중간에 롤백을 해도 읽기 트랜잭션은 롤백 전 데이터를 조회할.. TIL/TIL 2022. 10. 6. [BE]무한 스크롤(Infinite Scrolling) & 페이지네이션(Pagination) 요즘 사람들이 많이 사용하는 어플리케이션에 무한 스크롤이 없는 것을 오히려 찾아보기 힘들 정도라고 생각한다. 막상 쓸 때에는 이것을 어떻게 구현하냐? 라는 것에 대해 고민을 크게 해본적이 없었지만, 이번에 구현해보면서 했던 고민과 알게 된 점을 적고자 한다. 무한 스크롤은 말그대로 페이지 이동을 하지않고 계속 내려도 (보여줄 컨텐츠가 있다면) 컨텐츠를 무한정으로 보여주는 기능을 의미한다. 이러한 기능을 어떻게 구현할 것이냐? 라고 물으면 그냥 바로 생각나는 것은 무한대의 컨텐츠를 서버에게 요청하고 클라이언트가 받아서 줄줄이 소세지마냥 보여줍니다! 라는 생각이 났었다. 동작을 할 것이다 하지만 생각을 하면서도 너무 비효율적일 것이라는 생각을 동시에 하게 된다. 어떤 유저는 우리가 의도한대로 한 화면에서 무.. TIL/BackEnd 2022. 10. 4. Node.js와 Express 그리고 Nest.js Node.js 란? Node.js는 서버 사이드 도구들과 어플리케이션을 JavaScript로 만들 수 있도록 해주는 런타임 환경 런타임 환경이란 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태 Node.js 의 장단점 장점 싱글 스레드 기반 Non Blocking, 비동기 IO처리로 매우 빠른 고성능 서버 CPU 파워를 많이 필요로 하지 않는, 연결을 동시에 처리해야 하는 상황에서 좋음 프론트엔드와 벡엔드 기술의 통합으로 언어들 사이의 context shift를 다루는 시간을 줄일 수 있음 단점 싱글 스레드 모델이기에 하나의 작업이 오래 걸리면 전체 시스템 성능에 영향 많이 줌 ⇒ CPU 파워를 많이 필요로 하는 작업에 부적절 스크립트 언어의 특성 상 런타.. TIL/TIL 2022. 10. 3. 이전 1 2 3 4 5 ··· 9 다음 반응형