본문 바로가기

전체 글

(33)
Logging vs System.out.println() System.out.println() 은 괄호안의 메시지만 출력되는데 반해서, Logging은 출력 날짜, 시간, 문제의 수, 로그가 발생한 위치가 출력된다. Logging을 쓴다면 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)을 설정해서, 출력될 로그의 레벨을 설정할 수 있다. System.out.println()의 내부함수가 동기화(synchronized) 처리가 되어있다. 따라서 System.out.println()를 많이 쓴다면, 멀티 쓰레드 환경에서 오버헤드가 발생할 확률이 높다. -> System.out.println() 보다는 Logging을 쓰도록 하자. 출처: https://hudi.blog/do-not-use-system-out-println-for-..
가상 메모리 가상 메모리란? 가상메모리는 프로그램에 실제 메모리 주소가 아닌 가상 메모리 주소를 할당하는 방식입니다. 가상 메모리를 사용함으로써, 부족한 메모리를 보조할 수 있습니다. 가상 주소에 있는 분할 공간 하나를 페이지, 물리 주소(메모리 + 하드디스크)에 있는 분할 공간 하나를 프레임이라고 합니다. 그리고 이 둘을 페이지 테이블에서 매핑해줍니다. CPU는 프로세스를 실행하면서 페이지 테이블을 통해 페이지를 조회합니다. OS는 프로세스들의 내용(페이지) 중에서 중요한 부분은 메모리, 덜 중요한 부분은 하드디스크에 저장합니다. 페이지 폴트란? 가상 메모리에는 존재하지만, 실제 메모리에는 없는 데이터나 코드에 접근할 경우에 발생하는 에러가 페이지 폴트입니다. 페이지 폴트가 발생하면 해당 페이지를 메모리의 비어있는..
데드락(교착 상태) 두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태 무한히 자원을 기다리게 되는 상태를 말한다. 데드락(DeadLock) 발생 조건 4가지 모두 성립해야 데드락 발생 (하나라도 성립하지 않으면 데드락 문제 해결 가능) 1) 상호 배제(Mutual exclusion) 자원은 한번에 한 프로세스만 사용할 수 있음 2) 점유 대기(Hold and wait) 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 함 3) 비선점(No preemption) 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음 4) 순환 대기(Circular wait) 모든 자원에 대하여 일련의..
Rest API란 Rest API의 탄생 REST는 Representational State Transfer라는 용어의 약자로서, 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로, 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워했습니다. 그래서 웹의 장점을 최대한 활용할 수 있는 아키텍처로써 REST를 발표했다고 합니다. REST의 정의 “Representational State Transfer” 의 약자 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다. 즉, 자원(resource)의 표현(representation) 에 의한 상태 전달 자..
Spring Bean Spring Bean이란? Spring IoC 컨테이너가 관리하는 자바 객체를 Bean이라고 합니다. 기존의 자바에서는 new를 통해서 객체를 생성했다면, Spring Bean을 사용하면 Spring에서 자체적으로 객체를 생성하고 관리해줍니다. Spring Bean을 등록하는 방법 1. @Bean (with @Configuration) 설정 클래스에서 @Bean을 사용해 수동으로 스프링 컨테이너에 빈을 등록하는 방법이 있습니다. @Configuration public class TempConfig { @Bean public TempBean tempBean() { return new tempBean(); } } @Configuration 안에서 @Bean을 사용하면 됩니다. (@Configuration 안..
IoC IoC (제어 반전) 객체의 생명주기(객체의 생성, 초기화, 소멸, 메서드 호출 등)는 클라이언트 구현 객체가 직접 관리한다. 다른 사람이 작성한 외부 코드(라이브러리)를 호출하더라도, 해당 코드의 호출 시점 역시 직접 관리한다. 하지만 스프링과 같은 프레임워크를 사용할 때는 다르다. Controller, Service 같은 객체들의 동작을 우리가 직접 구현하지만, 해당 객체들이 어느 시점에 호출될 지는 신경쓰지 않는다. 단지 프레임워크가 요구하는대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다. 이를 제어 반전이라고 한다. 제어 반전의 목적은 다음과 같다: - 프로그램의 진행 흐름과 구체적인 구현을 분리시킬 수 있다...
DML, DDL, DCL - DML(데이터 조작 언어) - 대상 데이터의 검색, 등록, 업데이트 및 삭제를 위한 언어 또는 언어 요소 SELECT - 검색 (질의) INSERT - 삽입 (등록) UPDATE - 업데이트 (수정) DELETE - 삭제 - DDL(데이터 정의 언어) - 데이터 구조의 생성, 업데이트, 삭제를 위한 언어 또는 언어 요소 CREATE - 새로운 데이터베이스 관계 (테이블), VIEW, 인덱스, 저장 프로시저 만들기 DROP - 이미 존재하는 데이터베이스 관계(테이블), 뷰, 인덱스, 저장 프로시저를 제거한다. ALTER - 이미 존재하는 데이터베이스 개체에 대한 변경, RENAME의 역할을 한다. TRUNCATE - 관계 (테이블)에서 데이터를 돌이킬 수 없는 제거 * DELETE와 TRUNCATE의 ..
savedInstanceState onSaveInstanceState와 onRestoreInstanceState로 상태저장을 할 수 있다. onSaveInstanceState public class MainActivity extends AppCompatActivity { int score; int level; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState != null){ score = savedInstanceState.getInt("score"); level = savedInstanceState.g..