본문 바로가기
관리자

Programming-[Backend]/Java

(44)
[자바 기초] 2. 자바의 동작원리 : 클래스 로딩과 JVM 메모리 지난 글에서 우리가 작성한 소스 코드는 javac 컴파일러에 의해서 바이트코드로 변환된다고 했다. 이것이 .class 확장자를 갖는 파일이며 이 파일들이 classLoader에 의해 JVM(Java Virtual Machine)에 로딩된다. 이번 글에서는 클래스가 로딩되는 JVM 메모리의 구성과 과정에 대해서 이해해본다. 1. Loading, Memory의 의미 Load 의 의미 classLoader를 검색해보면 클래스 파일들을 로딩하는 역할을 한다고 나와있다. 그런데 도대체 로딩이 무엇인지 설명하는 글을 찾기가 어렵다. 컴파일된 파일들을 로드한다는 것이 무슨 의미일까? 클래스 파일을 로드한다는 것은 프로그램에서 클래스 파일을 이용할 수 있도록 특정 메모리 영역에 클래스 파일의 정보를 저장하는 것을 의미..
[자바 기초] 1. 자바의 동작원리 : 프로그래밍의 동작 원리 1. 자바 개요 자바는 1996년에 JDK 1.0으로 최초 출시되었다. 원래는 다양한 환경에서 작동하는 프로그래밍 언어를 만들기 위해서 고안되었으며, 가전제품 내 탑재되기 위해 개발되었다고 한다. 자바의 특징 중 가장 중요한 점은 JVM(Java Virtual Machine, 자바 실행환경)에서 동작한다는 점이다. 이 덕분에 자바는 운영체제(OS)에 호환되는 JVM만 있다면 어떤 OS에서도 동작이 가능하다. 2. 자바 코드 실행 과정 자바 코드의 실행 과정은 아래 그림으로 요약된다. 여기서 우선 JAVA Compiler가 작동하는 원리에 대해서 이번 글에서 자세히 알아본다. 3. 컴파일 : Java Source -> Java Byte Code 사용자가 java 환경에서 작성하는 코드의 확장자는 .java..
[TIL][작성중] 자바 일급 객체로 소프트웨어 안정성 높이기, 한계점 https://jojoldu.tistory.com/412 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유 최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코 jojoldu.tistory.com 일급객체 만들기 : 객체를 클래스로 Wrapping하고 객체에 add나 set을 할 수 없게 막는다. 1. 불변으로 만들 수 있다. Setter, Getter를 만들지 않고, validation하는 코드를 넣어놓으면 외부에서 다른 사람이 파라미터로 받아오는 객체를 마음대로 수정할 수 없다. 2. 하나의 기능을 온전히 표현한다. 각 필드값을 마음대로 ..
[TIL][TDD] TDD 4편. 자바 Reflection 의 원리와 활용, Spring의 ReflectionTestUtils.invokeMethod 1. Reflection의 정의와 원리 자바의 Reflection은 어떤 클래스의 구현 내용을 모를 때, 해당 내용들을 조회할 수 있도록 자바에서 제공하는 API라고 한다. 이것은 참조 2에 따르면, 자바는 클래스 파일을 바이트 코드로 컴파일하여 static 영역에 위치하게 되므로 여기서 해당 클래스의 정보를 가져올 수 있는 것이라고 한다. 가져올 수 있는 정보는 아래와 같다. ClassName Class Modifiers Package Info Superclass Implemented interfaces Constructors MethodsFields Annotations 2. Reflection 사용해보기 TestClassForReflection라는 클래스를 임시로 만들고 .class 뒤에 .을 붙이..
[TIL] 자바 리스트 2개 이상 stream으로 순차적으로 비교 처리하기 : LongStream, IntStream for문을 안쓰고 길이가 같은 리스트의 정보들을 순차적으로 처리할려면, stream 문법으로 LongStream 또는 IntStream을 사용하면 된다. for(int i = 0; ...) 을 쓰지 않는 방법이다. 1 2 3 4 5 6 7 8 9 10 int size = AList.size(); List result = IntStream.range(0, size).boxed().map(i -> { ADto aDto = AList.get(i); BDto bDto = BList.get(i); //필요한 로직 처리... //ex) aDto.setName(bDto.getName()); return aDto }).collect(Collectors.toList()); Colored by Color Scripter cs
[TIL][TDD] TDD 3편. 인터페이스 분리로 테스트는 분리, 서비스는 트랜잭션으로 묶기 TDD 2편에서는 서비스 메서드를 기능(의미)적으로 분리해가며 작성하는 것이 TDD 방식의 기본이라고 기록했다. 이번 글에서는 이것을 각 인터페이스로 분리해서 설계하는 방법에 대해 정리한다. 정확한 정보는 아닐 수 있으니 이 글을 발견하시는 분이 있다면 참조만 하시길. TDD 2편 [TIL][TDD] 테스트 코드 기반으로 짜되, service 코드에서 의미적으로(기능적으로) 분리해가며 작성하기 1. 문제점 1-1. 메서드를 분리하면 트랜잭션 하나로 묶이지 않는다. 다른 사용자가 실행 순서를 기억해야한다. 2편에서 다룬 것처럼 서비스 코드를 메서드별로 분리하면서 테스트하면 좋다. 그런데, 분리만 하다보면 모든 서비스 코드가 개별 트랜잭션으로 분리되고, Controller에서 각 service 메서드들을 불..
[TIL][TDD] 테스트 코드 기반으로 짜되, service 코드에서 의미적으로(기능적으로) 분리해가며 작성하기 전체 그림 1. API 분석 및 테스트 코드 작성 API 분석을 잘하는 것이 가장 중요하다. 요구되는 기능과 사양이 어떤지 명확히 알고, 그에 따른 경우의 수와 상황 등을 구체적으로 작성해본다. 최대한 많은 경우의 수를 고려하여 명기해놓고, 이것을 테스트 코드로 옮겨적으면 된다. 케이스별로 필요한 데이터를 Mock 데이터로 만들어서 테스트를 진행한다. 2. 테스트 통과를 위한 구현체 코드 작성 및 메서드 묶기 작성한 테스트 코드를 의미적, 기능별로 Service 메서드의 기능으로 묶어서 생각한다. 그리고 이 테스트 코드들을 통과하기 위한 구현체 코드를 작성한다. 테스트를 먼저 작성하고 이를 통과하기 위해 구현체 코드를 작성하므로 Test Driven Development가 된다. 이렇게 개발을 하면 최대..
[TIL]자바 리스트 중복 항목만 추출 : indexOf, lastIndexOf, HashSet 활용 자바의 리스트에서 중복된 항목들만 뽑아내기 위해 indexOf, lastIndexOf, HashSet을 활용한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test void overrodeTest() { List list = List.of("사자", "호랑이", "사자", "토끼", "거북이", "거북이", "사자"); HashSet hs = new HashSet(); for (String el : list) { if (list.indexOf(el) != list.lastIndexOf(el)) { hs.add(el); } } System.out.println("hs = " + hs); } Colored by Color Scripter cs 출력결과 원리 List.indexOf : 리스..