전체 글
배열과 연결리스트 차이는?
배열 배열은 인덱스를 가짐. 원하는 데이터를 한번에 접근하기 때문에 접근 속도 빠름. → 시간 복잡도는 O(1) 크기 변경이 불가능하며, 데이터 삽입 및 삭제 시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야 되는 단점 존재 ( 삽입, 삭제가 연결리스트에 비해 불리한 이유 ) 연결리스트 연결리스트는 인덱스 대신에 현재 위치의 이전/다음 위치를 기억함. 크기는 가변적. 인덱스 접근이 아니기 때문에 처음부터 순차적으로 탐색해야 한다. (따라서 배열보다 속도 느림) → 시간 복잡도 O(n) 질문) 왜 연결리스트는 검색할 때, 처음부터 순차적으로 탐색해야 하는가? 답변) 노드는 연속된 메모리 공간에 존재하지 않고 모두가 떨어져 있기 때문이다. 탐색을 위해서는 각 노드가 기억하고 있는 앞의 데이터와 뒤의 ..
역직렬화란?
바이트로 변환된 데이터를 다시 객체로 변환하는 기술 직렬화 된 바이트 형태의 데이터를 객체로 변환해서 JVM 으로 상주시키는 형태 기술 자바 역직렬화 조건 직렬화 대상이 된 객체의 클래스가 클래스 path 에 존재해아하며 import 되어 있어야 한다. 중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 한다 (같은 시스템 내부이라도 소스 버전이 다를 수 있다.) 자바 직렬화 대상 객체는 동일한 serialVersionUID 를 가지고 있어야 함 Reference) https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5BJava%5D%20%EC%A7%81%EB%A0%AC%ED%..
직렬화란?
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술 질문 - 왜 바이트 형태로 데이터를 변환해야 하는가? 답변 - 각자 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 갖기 때문에, Reference Type의 데이터들은 인스턴스를 전달 할 수 없다. 따라서, 이런 문제를 해결하기 위해선 주소값이 아닌 Byte 형태로 직렬화된 객체 데이터를 전달해야 한다. 자바 직렬화 조건 자바 기본(primitive) 타입 java.io.Serializable 인터페이스를 상속받은 객체 Reference) https://github.com/gyoogle/tech-interview-for-developer/blob/master/L..
Java의 메모리 영역은?
배경 & 질문 의도 JVM 구조의 이해 답변 메소드, 힙, 스택, pc 레지스터, 네이티브 영역으로 구분됩니다. 메소드 영역은 클래스가 로딩될 때 생성되며 주로 static 변수가 저장됩니다. 힙 영역은 런타임시 할당되며 주로 객체가 저장됩니다. 스택 영역은 컴파일시 할당되며 메소드 호출시 지역변수가 저장됩니다. pc 레지스터는 스레드가 생성될 때마다 생성되는 영역으로 다음 명령어의 주소를 알고 있습니다. 네이티브 영역은 자바 외 언어로 작성된 코드를 위한 영역입니다. 힙과 스택은 같은 메모리 공간을 동적으로 공유하며, 과도하게 사용하는 경우 OOM 이 발생할 수 있습니다. 힙 영역은 GC 를 통해 정리됩니다. 키워드 & 꼬리 질문 Method Area (Class Area) 클래스가 로딩될 때 생성됩니..
자바 컴파일 과정
들어가기전 자바는 OS에 독립적인 특징을 가지고 있습니다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분인데요. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보도록 하겠습니다. 자바 컴파일 순서 개발자가 자바 소스코드(.java)를 작성합니다. 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다. 컴파일된 바이트 코드를 JVM의 클래스로더(Cl..
가비지 컬렉션이란?
가비지 컬렉션이란? 자바가 실행되는 JVM 에서 사용되는 객체, 즉 Heap 영역의 객체를 관리해 주는 기능을 말합니다. 사용하지 않는 객체는 메모리에서 삭제하는 작업을 GC라고 부르며 JVM에서 GC를 수행합니다. 이 과정에서 stop the world 가 일어나게 되며, 이 일련 과정을 효율적으로 하기 위해서는 가비지 컬렉터 변경 또는 세부 값 조정이 필요합니다. JVM의 메모리는 총 5가지 영역(class, stack, heap, native method, PC)으로 나뉘는데, GC는 힙 메모리만 다룹니다. 일반적으로 다음과 같은 경우에 GC의 대상이 됩니다. 객체가 NULL인 경우 (ex. String str = null) 블럭 실행 종료 후, 블럭 안에서 생성된 객체 부모 객체가 NULL인 경우..
JVM이란?
자바 가상 머신(Java Virtual Machine) 시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공함 JVM은, 다른 프로그램을 실행시키는 것이 목적이다. 갖춘 기능으로는 크게 2가지로 말할 수 있다. 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하는 것 프로그램 메모리를 관리하고 최적화하는 것 JVM은 코드를 실행하고, 해당 코드에 대해 런타임 환경을 제공하는 프로그램에 대한 사양임 개발자들이 말하는 JVM은 보통 어떤 기기상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭한다. 자바 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바 API와 함께 실행하는 역할. JAVA와 OS 사이에서 중개자 ..
@RequestBody vs @ModelAttribute
Post 요청 메서드를 작성하던 도중, 둘 중 어느것을 사용해야 할지를 고민했던 경험이 있어서 작성하게 됐습니다. 왜 고민했을까? 클라이언트 측에서 보낸 데이터를 Java 코드에서 사용할 수 있는 오브젝트로 만들어 줄 수 있다는 공통점이 있어서 그렇습니다. 그러면 어떤 차이점이 있는데? @RequestBody는 요청 본문의 JSON, XML, Text 등의 데이터가 적합한 HttpMessageConverter를 통해 파싱되어 Java 객체로 변환 된다. @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 setter 메서드가 필요없다. 하지만, 직렬라를 위한 기본 생성자는 필수 바인딩을 위한 필드명을 알아내기 위해 getter, setter 중 하나는 정의되어 있어야 한다. @ModelAtt..
Bash Shell 기본 명령어
ls : 파일 리스트 출력 ls -l : 파일 리스트 출력(좀더 자세한 정보) ll : 파일 리스트 출력(좀더 자세한 정보) ls -al : 파일 리스트 출력(좀더 자세한 정보 + 숨김파일까지 표시) clear : 화면 지우기 pwd : 현재 위치 표시 cd ~ : 자신(운영체제 사용자)의 개인폴더로 이동 cd /폴더명A/폴더명B : 루트폴더 기준에서 해당 폴더로 이동(절대이동) 팁 : 대부분의 경우 ./는 생략가능 cd ./폴더명 : 해당 폴더로 이동(상대이동) cd .. : 상위 폴더로 이동(상대이동) rmdir ./폴더명 : 디렉토리 삭제(디렉토리안에 파일이 없어야 함) mkdir ./폴더명 : 디렉토리 생성 mkdir -p ./폴더명A/폴더명B : 디렉토리를 한번에 여러개 생성 vim 문서파일명 ..
@Transactional 실수
오늘은 프로젝트 중 팀원에게 피드백 받은 내용을 포스팅 하려고 합니다. 상황 하나의 요청(Post)으로 인해 데이터 리스트들을 두 개의 엔티티(A, B)에 저장해야 하는 상황. 이때 저는 A Controller에서 for문으로 (A, B) Service의 save 함수를 호출 했습니다. 막상 코드를 작성할 때는 데이터에 오류가 생기더라도 save 함수에 @Transactional로 롤백이 될 거라고 생각했습니다. 하지만, 팀원이 "for문에서 save 함수가 하나라도 오류가 나면 전부 다 롤백이 되어야 할 것 같아요" 라는 말을 듣고 for문 로직을 service로 옮겼습니다. 수정 전 @Controller public class TogehterController{ ... @PostMapping("/re..
form에서 공백 체크하는 방법
HTML JavaScript function NaverSearchForm__submit(form) { form.query.value = form.query.value.trim(); if (form.query.value.length == 0) { alert("검색어를 입력해주세요."); form.query.focus(); return; } form.submit(); } onsubmit에서 return false의 역할은 action이 실행되지 않도록 함. ( 그냥 가만히 있음 ) 즉, return false를 생략하면 검색어가 공백이 있든 없든 action이 활성화 됨 그렇기 때문에 return false까지 코드를 작성하고 검색 버튼을 누르면 아래 케이스처럼 작동 공백 없이 검색어 입력 -> 네이버창에 ..
연관관계 편의 메서드 필요성 [Spring]
이전에 JPA를 공부하면서 배웠던 내용이지만, 복습 차원에서 양방향 매핑시 주의해야할 점과 연관관계 편의 메서드 작성 방법에 대해 포스팅 하겠습니다. 위와 같이 Member : Team은 N : 1 관계 입니다. 그래서 연관관계의 주인은 Team의 외래키를 가지고 있는 "N"인 Member로 볼 수 있습니다. 그러면 Member와 Team의 엔티티에서 @ManyToOne, @OneTomany 어노테이션을 어떻게 선언해야 할까요? @Entity public class Member{ ... @ManyToOne @JoinColumn(name ="team_id") private Team team; } @Entity public class Team{ ... @OneToMany @Column(mappedBy = "..