String, StringBuffer, StringBuilder 알고 사용하자
·
JAVA
문자열을 더하는 로직문자열을 더하는 방법으로 무엇이 있을까?String 의 + 연산String.concatStringBuffer or StringBuilder 의 append 메서드String 으로 문자열 더하기 String str = "String";str += "plus";문자열을 더하는 연산을 할 때는 String 으로 작성하면 무슨 문제가 발생할까String 으로 문자열 더하기 연산을 하면 더해진 문자열을 저장하는 String 객체를 하나 더 생성한다.새로운 객체를 생성하여 메모리에 할당하는 연산과 이전과 같은 객체가 많이 쌓여 GC가 수행되는 연산까지 합쳐져 오버헤드를 발생하기 때문에 String 으로 더하기 연산은 오버헤드를 발생한다.StringBuilder , StringBuffer 로 더하..
System.currentTimeMills(), System.nanoTime() 알고 사용하자
·
JAVA
시간 측정을 위한 메서드 로직보통 시간을 측정하기 위해 System.currentTimeMills() 이나 System.nanoTime() 을 사용하여 측정하고자 하는 시간을 측정한다.두 개의 차이점과 어떤 상황에 쓰는지 알아보자System.currentTimeMills()현재 시간과 UTC인 1970년 1월 1일 자정과의 차이로 밀리세컨드(1/1000 초) 값을 반환한다.public class TimeMeasureMillis { public static void main(String[] args) { long start = System.currentTimeMillis(); // 시작 시각 (ms) // 측정할 코드 for (int i = 0; i System...
깊은복사와 얕은복사란? Cloneable 을 사용하지 말자
·
JAVA
깊은 복사와 얕은 복사얕은 복사란?원시타입이 아닌 객체와 같은 참조형(reference) 타입의 변수를 그대로 복제를 한다면 값이 복사되는 것이 아닌 주소값이 복사되어 결국 같은 힙의 데이터를 바라보는 꼴이 되어 버린다public class Main { public static void main(String[] args) { Test t1 = new Test(10); Test t2; // 복사할 변수 t2 = t1; // 얕은 복사 System.out.println(t1 == t2); // 두개의 참조값이 같으므로 true t1.setValue(20); System.out.println(t2.getValue() == t1.getValue());// t1의 값을 변경했으므로 t2의 값도 변경됨...
자바의 제네릭 기초부터 deep dive
·
JAVA
Object 타입의 위험성타입이 불특정될 때 Object 타입을 사용하는 것의 문제 public class CastingDTO implements Serializable { private Object object; public void setObject(Object obj) { object = obj; } public Object getObject() { return object }}타입이 불특정적일 때 위처럼 Object 로 타입을 선언할 수 있다.public static void main(String[] args) { CastingDTO dto = new CastingDTO(); dto.setObject(new String()); String s1 = (Str..
java 에서 equals 와 hashcode 를 재정의 해야하는 이유
·
JAVA
동등성(equality)과 동일성(identity)동일성(identity)자바에서 동일성은 비교되는 두 변수의 값이 같은지를 비교한다.물리적으로 같으냐를 생각해도 좋을 듯하다.‘==’ 연산자로 비교를 진행한다.동등성(equality)자바에서 동등성은 두 객체의 내용이 같은지를 의미한다.동일성과 비교해 논리적인 같음을 비교한다.모든 자바 클래스는 Object 클래스를 상속받는데 Object 의 equals 로 동등성을 비교한다.class Person{ private String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) re..
상속보단 조합을 선호하라 - Favor composition over inheritance
·
백엔드/아키텍처 & 패러다임 & 디자인 패턴
조합을 선호하라 - Favor composition over inheritanceis-a , has-a 관계의 차이관계실행되는 프로그램 내에는 여러 객체들간의 상호작용으로 이루어진다.이러한 객체들간의 상호작용을 위한 방식이나 형태를 모델링하는 개념이 관계이다.관계는 다음과 같은 종류로 나뉘어져 있다. is-a 관계is-a는 말 그대로 'A는 B이다'일 때의 '~이다'와 같다.Dog is a Animal 과 같은 관계를 가지는 것을 의미한다.코드에서는 관계를 상속으로 이를 표현한다. has-a 관계has-a 는 특정 객체를 다른 객체에 포함되는 관계를 의미한다.Computer has a CPU, RAM and MainBoard 같은 것을 의미한다.코드에서는 관계를 멤버 변수로 이를 표현한다. 상속의 문제점..
[Yabam] 야밤 프로젝트 운영 회고
·
회고
서론야밤은 컴공 학창 시절에서 가장 기억에 남고 애정이 가는 프로젝트였다. 대학교 축제를 위한 테이블 오더 플랫폼인 야밤은 기획부터 점주들에게 사용 유치를 하고 실제 축제에서 배포하고 사용자들의 피드백을 듣기까지 너무 재밌었고 설렜었다. 축제하는 주에는 혹시 버그가 있지 않을까 잠도 못자며 집에서 로그를 확인했다. 마지막 날에는 축제 주막 안에서 사용자들의 피드백을 받으면서 생각하지 못한 부분을 고민하기도 하고 잘 사용하는 모습에 뿌듯해 하기도 했다. 이번 글은 이런 야밤 백엔드 프로젝트에서 개발 - 배포 - 운영까지 전체적으로 어떻게 설계했는지 방법을 알려주고 회고하는 글이다. 야밤 서비스의 특징야밤 서비스는 대학교 축제를 위한 테이블 오더 플랫폼이다.대학교 축제 특성상 정기적인 트래픽이 발생하지 않으..
Redis의 영속화 뜯어보기 (+docker 환경에서 Redis 세팅 법)
·
백엔드/DB
서론Redis는 대표적인 In-Memory DB다.In-Memory 이기 때문에 Redis 서버를 재시작할 때 데이터는 영속화되지 않고 날라간다.(휘발성)이러한 Redis의 In-Memory 성질로 빛을 받았지만 추가적으로 Redis에서는 휘발 되지 않게 영속화 시켜주는 방안을 제시한다.참고 문헌책 : 개발자를 위한 레디스:7장문서 : 레디스 공식 문서레디스의 영속화2가지 방안AOF ( Append Only File) : 레디스 인스턴스가 처리한 모든 쓰기 작업을 차례대로 기록, 복원 시에는 파일을 다시 읽어가며 데이터 세트 재구성RDB (Redis DataBase) : 일정 시점에 메모리에 저장된 데이터 전체를 저장(snapshot 방식)위 예제는 AOF 와 RDB의 저장 예시이다. AOF는 레디스에서..
SpringDataJpa 알고 사용하시나요? - 공식 문서 훑어보기
·
백엔드/JPA
서론Jpa를 사용하면 DB 중심의 개발만 가능하다?Spring 백엔드 개발자라면 SpringDataJpa 를 무조건 사용해보는데 나 같은 초보가 SpringDataJpa를 사용하면 SpringData가 제공하는 유용한 기능을 많이 활용 못하는 경우가 많다.나 같은 경우도 SpringDataJpa를 사용하면서 JPA의 DB 테이블 매핑과 지연로딩, SpringDataJpa 의 JPA를 유용하게 사용하는 쿼리 매서드만을 생각하고 공부했다. SpringData 와 Jpa는 서버 개발자가 DB의 패러다임과 객체지향의 패러다임의 차이를 해소하고자 많은 기능을 제공한다. 하지만, 정작 Jpa와 SpringDataJpa 가 제공하는 유용한 기능과 핵심 컨셉을 배제하며 공부와 개발을 했다. 이번 포스팅은 SpringD..
[java의 병렬 프로그래밍] complete 할 수 있는 Future -CompletableFuture 의 원리와 사용법
·
JAVA
자바 병렬 프로그래밍 시리즈[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리[java의 병렬 프로그래밍] 경쟁상태의 2가지 패턴과 Java 동기화 기본[java의 병렬 프로그래밍] JAVA 동기화와 옳은 사용 가이드[java의 병렬 프로그래밍] Thread를 사용하지 말자 - Executor, Executors, ExecutorService 원리 와 사용법 Future 의 단순 활용지난 글에서 Thread API 없이 Executor API 를 사용해서 고수준 비동기 프로그래밍을 설명했다. Executor 는 비동기 연산의 결과를 나타내는 Future 라는 반환값을 사용하는데 Future는 비동기 연산에 관한 많은 편의성을 제공해준다. 다음은 Future를 사용한 예제이다.@Testvoi..