본문 바로가기

개발/Java

[Java] Design-Pattern : ProtoType 프로토타입 패턴은 싱글톤과 같이 생성 패턴(Creathinal Patterns) 중 하나이다. 기존 인스턴스를 프로토타입으로 사용하여 복제해 새로운 인스턴스를 생성하는 디자인 패턴이다. 최상위 객체인 Object 객체의 clone() 메서드를 활용하여 객체를 복제할 수 있다. 실제 clone() 메서드를 오버라이드 하고자 한다면, Cloneable 인터페이스를 구현하면 된다. 아래와 같은 클래스가 있다고 가정하자. public class GithubIssue { private int id; private String title; private GithubRepository repository; public GithubIssue(GithubRepository repository) { this.reposit.. 더보기
[Java] Design-Pattern : Singleton(2) 이전 포스트에서 싱글턴 객체를 생성하는 기본적인 방법과, 멀티 스레드 환경에서 동시성 이슈에 대응하여 싱글턴을 생성하는 방법에 대해 알아보았다. 하지만 이렇게만 하여도 완벽하게 동일한 객체를 생성하였다고 할 수 있을까? 기존에 생성한 싱글턴 구현을 깨는 방법과 그 방법들을 막는 방안에 대해 살펴보자. 직렬화, 역직렬화를 통한 객체 생성 먼저 Settings 객체에 직렬화 인터페이스를 구현한다. public class Settings implements Serializable {} public class App { public static void main(String[] args) throws IOException, ClassNotFoundException { Settings settings = Sett.. 더보기
[Java] Design-Pattern : Singleton(1) 개발을 진행하면서 디자인 패턴에 대해 많이 듣게 된다. 특히 스프링은 컨테이너가 빈을 "싱글톤"으로 등록하여 사용한다고 하는데 지금까지는 어떠한 방법으로 싱글톤 패턴을 사용할 수 있는지, 그렇게 함으로 얻는 장점은 무엇인지 깊게 고민해보지 못한 듯 한다. 싱글톤 패턴은 객체가 오직 1개만 생성이 되는 패턴을 의미한다. 우리가 일반적으로 객체를 생성하는 방법은 new 연산자를 통해 할 수 있다. 물론 이렇게 생성한 두 객체는 동일하지 않다. public class App { public static void main(String[] args) { Settings settings = new Settings(); Settings settings1 = new Settings(); System.out.printl.. 더보기
[Java] 예외의 종류(Checked, UnChecked, Error) 현업에서 시간에 쫓기다보면, 가장 기본적인것부터 놓치기 쉬운것 같다. 기존 기능을 개선하는 과정에서, 단순 Read 로직이었던 부분에 Write, Delete 로직이 추가되었고, 그 당시에는 해당 부분을 모두 검증하였는데, 추후에 트랜잭션이 추가되면서, 직접 구현한 CustomException을 발생시키면서 모든 로직이 rollback 되었다. 실제 운영서버 중단 패치중에 일어난 일이었고, 명백히 검증을 소홀히 한 실수였기에 평소에 가장 기본적이었던 것들을 놓치고 있었던 기본들에 대해 다시금 생각해보게 되었다. 서론이 길었지만 결론적으로는 예외의 종류에 따른 처리 문제였다. Java에서 예외는 크게는 Error와 Exception으로 나누어지고, Exception은 또다시 Checked Exception.. 더보기
[Java] Enum 에 대해 실무를 진행하다보면 요구사항에 따라 수많은 분기처리가 되는 경우가 있다. 가장 심플하게 해결하자면 if 문으로 도배하면 되는데 (나야 나) 현실적으로 그렇게 처리하면, 구현하면서도 스스로 헷갈리고, 코드를 보는 사람의 입장에서도 굉장히 고달픈 일이 된다. 물론 적절한 분기처리를 수행하지 못해 예상과는 다른 결과가 도출되는 것은 덤. 실무에서는 이렇게 분기처리가 많을 경우 Enum을 사용하면 깔끔하게 정리하고 가독성도 높일 수 있다. 최근에도 사용하게 된 케이스가 있었는데 사실 사용하면서도, 실제로 Enum이 얼마나 더 많은 활용도를 가지고 있는지는 깊게 고민해보지 못했다. 실제 다른 기술 블로그들을 참고해보면 Enum의 기능에 대해 이야기하고 있는데, 살펴보자면 1. 데이터들 간의 연관관계를 표현해준다... 더보기
[Java] JVM - ClassLoader(아주 얕은 수준) 최근 APM(Application Performance Monitoring) 시스템을 담당하게 되면서, 기존 애플리케이션을 분석하는 과정에 있는데, 그동안 몰랐던 다양한 개념들에 대해 많이 알아가고 있는 중이다. 그리고 그 중에 JVM의 한 영역이 ClassLoader에 대해 간단한 역할 정도만 알고 있었는데, 조금 더 깊게 알아볼 기회가 생겼고, 그 부분에 대해 공부한 점을 정리하고자 한다. 이전에는 클래스로더를 단순히 ".class 파일을 읽어 바이너리 코드로 변환한다" 정도로만 알고 있었다. 클래스로더는 기본적으로 3가지로 구분된다(물론 Java 버전에 따라 조금씩 차이가 있다) Java 8을 기준으로 보면.. BootStrap ClassLoader Extension ClassLoader Appli.. 더보기
[Java]Try-with-resource 최근 자바 기본서 한 권을 마무리하면서, 당연히 기본적인 내용은 다 알 것이라고 생각했던 부분에서 전혀 몰랐던 개념들에 대해 많이 알게 되었다. 그 중 하나가 Try-with-resource이다. Try-with-resource는 Java 7 이후에 추가되었다. 일반적으로 자바에서 자원(리소스)을 사용할 때 Try { } catch { } 구문을 사용하고, 사용한 자원에 대해 close() 메서드 등을 통해 해제하는것이 일반적이다. 하지만 매번 개발자가 번거롭게 선언과 해제를 해주는 부분을 한층 더 편하게 가져가기 위해 Try-with-resource 개념이 도입되었다. 기존의 try-catch 구문은 아래와 같이 사용하였다. 주로 finally 구문을 선언해 리소스를 해제했다 문제는 개발자도 사람인지라.. 더보기
[Java] 자바의 메모리 영역(2) 최근 안드로이드 개발을 담당하면서, 스프링에 의존하여 웹개발을 하던 시기보다, JAVA의 근본적인 원리에 대해 더 깊은 이해가 필요하게 되었다. 새삼 스프링 프레임워크의 강력함에 대해 느끼게 됨과 동시에.. 기초가 많이 부족하다는 것 또한 깨닫게 되었다. 이전에 간략하게 메모리 영역에 대해 포스팅 하였으나, 이 기회에 조금 더 상세하게 이해하고 작성해보고자 한다. 1. 메모리 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간 메모리 구조에 대해 공부해야 하는 이유 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다. 메모리 관리가 되지 않는 경우 속도저하나 튕김이 발생할 수 있다. 한정된 메모리를 효율적으로 사용함으로서 높은 성능을 내고자 함. 2. JVM JVM은 Java Virt.. 더보기