분류 전체보기 8

[Docker] 도커를 SpringBoot 구축하고 실행하기

@RestController public class MainController { @GetMapping("/ping") public String check() { return "pong"; } } MainController 에 api를 만들어 줍니다. 또한, port는 7000번으로 지정해주었습니다. ./gradlew clean build 명령어를 통해 build 를 해 줍니다. 여기서, ./gradlew build를 해주어도 무방합니다. 이때 프로젝트에 Dockerfile 을 다음 내용과 같이 생성해줍니다. FROM openjdk:17 ARG JAR_FILE=build/libs/threedollar-application.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java..

Docker 2023.07.10

[이펙티브자바] 아이템7. 다 쓴 객체 참조를 해제하라.

핵심정리 어떤 객체에 대한 레퍼런스가 남아있다면 해당 객체는 가비지 컬렉션의 대상이 되지 않는다. 자기 메모리를 직접 관리하는 클래스라면 메모리 누수에 주의해야 한다. ex) 스택, 캐시, 리스너 또는 콜백 Stack 예시 public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // 다 쓴 참조 해제 return result; } 참조 객체를 null 처리 하는 일은 예외적인 경우이며, 가장 좋은 방법은 유효 범위 밖으로 밀어내는 것이다. but, 예외적인 경우가 흔하다. public class Stack { private Object..

Java 2023.05.10

[이펙티브자바] 아이템 6. 불필요한 객체 생성을 피하라

아이템 6. 불필요한 객체 생성을 피하라 핵심정리 문자열 사실 동일한 객체라서 매번 새로 만들 필요가 없다. new String(”java”)를 사용하지 않고 문자열 리터럴 (”java”)를 사용해 기존에 동일한 문자열을 재사용하는 것이 좋다. jvm 에서 문자열을 다 풀에서 캐싱을 하고 있다. 해시맵에 한 번 만들어진 문자열들을 담아놓고, 동일한 문자열을 참조하려고 하면 이미 만들어 놓은 상수들의 풀에서 동일한 문자열을 참조하는 방법으로 재사용한다. 그래서 new String() 은 사용하지 않는게 좋다. 정규식, Pattern 생성 비용이 비싼 객체라서 반복해서 생성하기 보다, 캐싱하여 재사용하는 것이 좋다. 오토박싱 (auto boxing) 기본 타입(int)을 그것에 상응하는 박싱된 기본 타입(I..

Java 2023.05.09

[이펙티브자바] 완벽공략 18. 가비지 컬렉션

완벽 공략 18. 가비지 컬렉션기본 개념Mark, Sweep, CompactYoung Generation (Eden, S0, S1), Old Generation금방 죽는 young Generation, 최초에 Eden 영역, 그리고 꽉 차게 되면 S0, S1,오랫동안 살아 남는 Old generation Minor GC(Young generation), Full GC(old generation) Throughput, Latency (Stop-The-World), Footprint이 3가지 관점에서 각각의 GC 로직을 봐야 한다.Throughput: application 처리량(서버에 역량이 100 이라고 봤을 때, 100의 리소스를 다 사용하면 Throughput이 아주 좋다. 할 일을 다 하기 때문에...

Java 2023.05.09

[이펙티브자바] 아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라

아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. Helper 성격의 factory들. public class UtilityClass { public static String hello() { return "hello"; } public static void main(String[] args) { String hello = UtilityClass.hello(); // 이때 인스턴스로 사용되는 것을 추천하지 않는다. } } 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. ⬇️ 아래의 코드처럼 생각할 수 있다. public abstract class UtilityClass { public st..

Java 2023.04.21

[Java] JVM 과 구조

더 자바 JVM (Java Virtual Machine) 자바 가상 머신으로 .class 파일을 os에 특화된 코드로 변환하여 실행한다. 바이트 코드를 실행하는 표준이자 (JVM 자체는 표준) 이자 구현체다. jvm 밴더: 오라클, 아마존,….. 특정 플랫폼에 종속적이다. JRE (Java Runtime Environment): JVM + 라이브러리 자바 애플리케이션을 실행할 수 있도록 구성된 배포판. JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일 JDK (Java Development Kit): JRE + 개발툴 JRE + 개발에 필요할 툴 오라클은 자바 11부터 JDK만 제공하며 JRE 따로 제공 x 자바는 오라클에서 만든 Oracle JDK 11 버전부터 ..

Java 2022.06.17

[JPA] 객체 지향 쿼리 언어, JPA와 JDBC 같이 사용

JPQL: 엔티티 객체를 대상으로 쿼리, SQL을 추상화 해서 특정 데이터 베이스 SQL에 의존하지 않는다. → 결국 SQL로 변환된다. Criteria: 표준 스펙에 들어간다. (실무에서 x → 유지보수 어려움) 권하지 않는다. QueryDSL: JPQL 을 잘 사용하면 QueryDSL 은 금방 사용 가능하다. (실무 사용 권장) 컴파일 시점에 문법 오류 찾을 수 있음 JPQL 빌더 역할 자바코드로 JPQL 작성 가능 native SQL : JPA가 제공하는 SQL을 직접 사용하는 기능. 특정 데이터베이스에 의존적인 기능 flush 는 commit, query가 날라갈 때 실행이 된다. (기본적인 auto모드 전략, JPA 관련해서 쓸 때는 상관이 없다.) JPA를 사용하면서 JDBC 커넥션을 직접 사..

JPA 2022.05.19

[JPA] cascade 옵션 & 고아 객체

영속성 전이 cascade 객체를 저장하거나 삭제할 때 연관된 객체도 함께 저장하거나 삭제할 수 있는 것. JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태이어야 한다. cascade는 그럼 언제 써야 할까? Life Cicle이 일치 할 때 단일 엔티티에 종속적일 때 ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장해야 할 때 사용한다. cascade는 연관관계와는 연관이 없다. CASCADE의 종류 ALL: 모두 적용 PERSIST: 영속 부모와 자식 엔티티를 한 번에 영속화 가능 REMOVE: 삭제 부모 엔티티를 삭제하면 연관된 자식 엔티티도 함께 삭제. MERGE: 병합 => 보통 cascade = CascadeType.ALL을 사용한다. 고아 객체 jpa는 부모 엔티티와 연관..

JPA 2022.05.16