Java 42

Java char과 String의 차이 (feat. Constant Pool)

Java char과 String의 차이 (feat. Constant Pool) char과 String 간단 정리표 - char String 타입 Primitive Reference 저장위치 Stack Stack + Heap 초기값 타입에 따른 초기값 제공 null char char은 Primitive-type입니다. Primitive-type 변수는 Stack Frame에 저장되며, call-by-value라는 특징이 있는데요. call-by-value를 간단한 예제 코드로 알아보겠습니다. class CallByValueTest { public static void main(String[] args) { // stack의 charA변수 영역에 'A' 저장됨 char charA = &#39..

Java 2022.02.15

JVM과 Garbage Collector

JVM의 구조 클래스 로더 런타임에 클래스 파일에서 바이트코드를 읽어 메모리에 저장합니다. 로딩 : 클래스를 읽어오는 과정 링크 : 참조 포인터를 연결하는 과정 초기화 : static 자원들을 초기화하고 변수에 할당합니다. 런타임 데이터 영역 Method Area, Heap, Stack, PC Register, Native Method Stack Method Area : 모든 스레드가 공유하는 영역으로, 클래스들의 정보 및 바이트 코드들을 저장합니다. Heap : 런타임에 동적으로 할당되는 영역으로, instance들이 주로 저장됩니다. Thread : 각 스레드는 아래 3개의 영역을 각자 가지게 됩니다. Stack : 스택프레임이 저장되는 공간으로, 지역변수, 메소드 매개변수, 메소드 정보 등이 저장됩..

Java 2022.01.24

Java에서의 동시성 제어

동시성 제어가 필요한 이유 서비스에 과도한 트래픽이 몰릴 경우, 서버가 예상한 대로 동작하지 않는 경우가 있습니다. 인프라에서 문제가 발생할 수도 있고, 코드에서 문제가 발생할 수도 있습니다. 인프라의 경우 AWS나 GCP같은 클라우드 서비스를 통하여 유동적으로 대처 가능하지만, 이미 서버에 배포된 코드는 유동적으로 대처하는것이 거의 불가능 하죠. 그래서 개발자는 항상 과도한 트래픽이 몰릴 경우를 미리 대비해야 합니다. 그럼, 아래에서 Java에서 동시성 제어를 위해 추가된 기능들에 대해 알아보겠습니다. 동시성 제어 public class Main { public static void main(String[] args) { CountInteger count = new CountInteger(); for ..

Java 2022.01.11

스프링 부트 핵심 라이브러리

Springboot 핵심 라이브러리(2.3.1.RELEASE) spring-boot-starter-web spring-boot-starter-tomcat : 톰캣(WAS) spring-webmvc : 스프링 웹 MVC spring-boot-starter-thymeleaf : 템플릿 엔진 spring-boot-starter(공통) spring-boot spring-core spring-boot-stater-logging slf4j : 로깅 인터페이스 logback : 로깅 구현체 Springboot 테스트 라이브러리 spring-boot-starter-test junit : 테스트 프레임워크 (springboot2.2 부터 junit5가 기본적으로 탑재됨) mockito : 목 라이크러리 assertj :..

Java/Spring 2021.12.03

[Spring] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 후기(+삽질)

스프링부트와 AWS로 혼자 구현하는 웹 서비스를 통해 공부한 개인적인 후기를 남깁니다. 이 책을 선택한 이유 평소 팔로우하던 개발자 중 한분이시고, 무중단 배포까지 다룬다는 점에서 기대하고 고르게 되었습니다. 그리고 사실, 이론 공부 보다는 손으로 만지작 거릴 수 있는걸 더 좋아하는 성향입니다. 그래서 실전 예제가 많이 포함되어있는 책으로 먼저 맛을 보고, 이론을 공부하고자 이 책을 선택했습니다. 이 책으로 공부하며 초~중반 프로젝트 진행하는 내용을 보며 초반에는 IntelliJ 설치, 프로젝트 환경 구성 등등 간단히 따라할 수 있는 예제들로 시작하여 빠르게 따라할 수 있었습니다. 2장 ~ 5장 까지 테스트코드 작성, JPA 맛보기, 머스테치로 화면 만들기, 스프링 시큐리티와 OAuth2로 소셜로그인 구..

Java/Spring 2021.11.17

[Java] JUnit의 assertThat보다 assertj의 assertThat을 써야하는 이유

이 글은 JUnit4를 기준으로 작성되었습니다. 테스트 코드를 작성할 때, 크게 두 부분으로 나누어서 생각할 수 있습니다. 1. 실행 단계 2. 검증 단계 실행 단계에서는 사용자 입력을 모방하여 테스트할 로직을 실행시킵니다. 검증 단계에서는 실행 단계가 예상한 대로 동작하는지 검증하게 됩니다. JUnit에서 이 검증 단계를 도와주는 메소드가 바로 org.junit.Assert.assertThat이라는 메소드 입니다. org.junit.Assert.assertThat 공식 문서 org.junit.Assert.assertThat의 기본 형태는 아래와 같습니다. public static void assertThat(T actual, Matcher

Java 2021.10.13

[JPA] JPA Entity 왜 단일키가 좋은가?

대부분 Entity의 키는 단일키로 하는것이 좋다고 설명합니다. 왜 그럴까요? 제가 봤던 책에서는 Entity의 키에 대해서 다음과 같이 이야기 합니다. (스프링 부트와 AWS로 혼자 구현하는 웹 서비스, 저자 : 이동욱) 왠만하면 Entity의 PK는 Long 타입의 Auto_increment를 추천합니다.(MySQL기준으로는 bigint타입) 주민등록번호와 같이 비즈니스상 유니크키 혹은 복합키로 PK를 잡을 경우 난감한 상황이 종종 발생함 1. FK를 맺을 때 다른 테이블에서 복합키를 모두 갖고있거나, 중간 테이블을 둬야하는 상황이 발생 2. 인덱스에 좋은 영향을 끼치지 못함 3. 유니크한 조건이 변경될 경우, PK전체를 수정해야 하는 일이 발생하나씩 살펴봅시다. 1. FK를 맺을 때 다른 테이블에서..

Java/JPA 관련 2021.10.06

[Spring] SpringBoot에서 @RestController의 역할

최근 SpringBoot를 공부하던 중에 Controller에 @RestController만 붙였는데 어떻게 ResponseBody를 JSON으로 자동 변환해주는지 문득 궁금하여 찾아보게 되었다. 혹시 Jackson이? 예전에 Spring을 공부할 당시, Jackson 라이브러리를 사용해서 ResponseBody를 JSON 형태로 변환했던것이 기억 났다. 확인해 보니 역시 그랬다. springboot-starter-web이 참조하는 라이브러리 중에서 spring-boot-starter-json 이라는 라이브러리가 jackson을 사용하고 있었다. 참조하는 라이브러리 중 핵심이 되는 것들은 다음과 같다. jackson-databind : jackson-core 인터페이스 구현체로, jackson의 핵심 기..

Java/Spring 2021.10.05

[객체지향] 3. POJO JAVA

0. POJO? Plain Old Java Object 다들 한번쯤 다들 한번쯤 들어본 단어이실 겁니다. POJO를 있는 그대로 해석해보면, '순수한 오래된 자바 객체' 정도로 해석할 수 있는데요. 이보다 더 자세히 이해하기 위해서 잠시POJO라는 개념이 등장하게 된 배경을 살펴봅시다. 1. 배경 예전에 많이 사용했던 백엔드 기술 중 EJB라는 기술이 있습니다. 엔터프라이즈급 서버 시스템 개발시 유용한 업무로직이 포함되어있어서 EJB에만 존재하는 클래스를 사용하여 개발된 시스템이 많았다고 하는데요. 하지만 시간이 지나 새로운 기술, 프레임워크들이 등장하며 시스템을 이식해야할 경우가 생겼다고 합니다. 이때, EJB에만 존재하는 클래스를 사용한 부분의 이식의 어려움이 있었고, 이러한 사례들 때..

Java 2021.07.27

[객체지향] 2. 객체지향 설계 5원칙 (SOLID)

0. 압도적 감사...! SOLID 원칙 이라고도 불리는, 객체지향 설계 5원칙은 선배 개발자분들의 시행착오와 고민들로 만들어진 객체지향 설계 가이드라인 입니다. 후배 개발자들이 자신들과 같은 고민을 하여 시간을 낭비하지 않도록 열심히 고민해주신 선배 개발자 분들에게 감사하며, 객체지향 설계 5원칙에 대해 알아봅시다. 1. S - 단일책임원칙 SRP (Single Responsibility Principle) 모든 클래스는 하나의 책임만 가져야 하고, 클래스는 그 책임을 완전히 캡슐화 해야한다는 원칙입니다. 자동차 클래스 (다중 책임) class 자동차 { public void 시동을건다(type) { if (type=="저가형") { this.is엔진동작 = true; } else if (type="고..

Java 2021.07.25