Java 공부를 시작하면서 가장 먼저 들었던 단어는 JVM, JRE, JDK였다.처음에는 이름이 비슷해서 구분하기 어려웠다. 코드를 바로 작성하기 전에 Java 프로그램이 어떤 과정을 거쳐 실행되는지부터 정리해 보았다.컴퓨터는 우리가 사용하는 자연어를 그대로 이해하지
Java 공부 2일차에는 변수를 배웠다.첫날에는 System.out.println()을 이용해 값을 바로 출력했다.이 정도로 짧은 코드에서는 값을 직접 작성해도 큰 문제가 없어 보인다. 하지만 같은 값을 여러 곳에서 사용하거나 나중에 값을 바꿔야 한다면 이야기가 달라진
지금까지는 변수에 값을 직접 저장해서 사용했다.하지만 프로그램에서 다루는 값이 모두 같은 성격을 가진 것은 아니다. 실행 중에 바뀌는 값도 있고, 처음 정한 뒤 바뀌면 안 되는 값도 있다. 사용자가 직접 입력해야 하는 값도 있다.이번에는 GitHub에 정리해 둔 d_c
지금까지는 코드를 위에서 아래로 순서대로 실행했다. 이번에는 조건에 따라 다른 코드를 실행하는 조건문과 같은 작업을 반복하는 반복문을 공부했다.if문은 조건식의 결과가 true일 때 중괄호 안의 코드를 실행한다.두 정수를 입력받아 더 큰 값을 찾는 코드를 작성해 보았다
여러 값을 하나의 이름으로 관리할 때 배열을 사용한다.배열을 사용하면 반복문으로 값을 차례대로 처리할 수 있다.그런데 배열의 합계나 최대값을 구하는 코드를 여러 곳에서 사용한다면 같은 반복문을 계속 작성해야 한다. 반복되는 기능은 메소드로 분리할 수 있다.배열은 같은
지금까지는 변수, 배열과 메소드를 각각 만들어 사용했다. 클래스는 서로 관련된 변수와 메소드를 하나로 묶을 때 사용한다.자동차를 표현한다면 브랜드, 가격, 색상은 변수로 만들고 자동차 정보를 출력하는 기능은 메소드로 만들 수 있다.클래스 안에 선언한 변수를 필드라고 한
지난 글에서는 클래스로 객체를 만드는 방법을 공부했다. 이번에는 여러 클래스에 공통된 부분이 있을 때 코드를 재사용하는 상속과, 같은 타입으로 서로 다른 객체를 다루는 다형성을 정리해보려고 한다.이번 내용은 자동차 예제에서 시작해 ATM 예제로 연결한다.상속은 기존 클
지난 글에서는 상속과 다형성을 공부했다. 부모 타입 하나로 여러 자식 객체를 관리하고, 오버라이딩을 통해 객체마다 다른 동작을 실행할 수 있었다.이번에는 한 단계 더 나아가 부모가 구체적인 동작을 정하지 않고, 자식에게 구현을 맡기는 방법을 알아봤다.추상 클래스는 완성
지난 글에서는 인터페이스와 익명 클래스를 공부했다. 익명 클래스를 사용하면 별도의 클래스 없이 인터페이스를 바로 구현할 수 있지만, 메서드 하나를 작성하기 위해 필요한 코드가 많다는 단점도 있었다.이번에는 익명 클래스를 간결하게 표현하는 람다식과, 람다식을 활용해 데이
프로그램을 만들다 보면 예상하지 못한 값이 들어올 때가 있다.정수를 입력하라고 했는데 문자를 입력하거나, 배열의 크기를 넘어서 값을 저장하려는 경우가 대표적이다. 이런 상황을 아무런 처리 없이 두면 프로그램은 오류 메시지를 출력하고 그대로 종료된다.오늘은 오류가 발생했
지금까지 작성한 프로그램은 대부분 입력받은 값을 계산하거나 화면에 출력하는 정도였다.그런데 실제 서비스에서는 프로그램 내부 기능만 사용하지 않는다. 회원가입 인증 메일을 보내고, 예약 정보를 문자로 전달하는 등 외부 서비스의 기능을 가져와야 할 때가 많다.오늘은 Git
프로그램에서는 날짜와 시간을 다룰 일이 생각보다 많다.게시글의 작성 시간을 기록하거나 회원가입 날짜를 저장할 수도 있고, 예약일이나 마감일까지 남은 시간을 계산할 수도 있다.오늘은 GitHub의 t_date 실습 코드를 바탕으로 자바의 Date, Calendar, Si
자바의 모든 클래스는 기본적으로 Object 클래스를 상속받는다.직접 extends Object를 작성하지 않아도 toString(), equals(), hashCode() 같은 메서드를 사용할 수 있는 이유다.오늘은 GitHub의 u_object 실습 코드를 보면서
배열은 여러 값을 한곳에 저장할 수 있지만 처음 정한 크기를 바꿀 수 없다.값이 몇 개 들어올지 모르는 상황에서는 배열보다 컬렉션이 편하다. 컬렉션은 데이터를 추가하거나 삭제할 수 있고, 저장 방식에 따라 List, Set, Map으로 나뉜다.오늘은 GitHub의 v_
객체를 다른 변수에 대입하면 새로운 객체가 만들어질까?처음에는 원본과 똑같은 객체가 하나 더 생긴다고 생각하기 쉽다. 하지만 객체 변수에 저장되는 것은 객체 자체가 아니라 객체를 가리키는 참조값이다.오늘은 GitHub의 copy 실습에 있는 Student와 Addres
지금까지 작성한 코드는 대부분 위에서 아래로 한 줄씩 실행됐다. 하지만 프로그램을 만들다 보면 여러 작업을 함께 처리해야 하는 경우가 생긴다.예를 들어 파일을 내려받는 동안 화면을 조작하거나, 여러 사용자 요청을 동시에 처리하려면 하나의 실행 흐름만으로는 부족하다. 이
프로그램에서 만든 데이터는 실행이 끝나면 사라진다.데이터를 다음 실행에서도 사용하려면 외부에 저장해야 한다. 가장 간단한 방법이 파일을 이용하는 것이다.이번에는 List에 담은 생선 이름을 fish.txt에 저장하고, 파일의 내용을 다시 읽어 컬렉션으로 만들어봤다.파일
지난 글에서는 컬렉션의 데이터를 파일에 저장하고 다시 불러왔다.파일만으로도 데이터를 남길 수 있지만, 데이터가 많아지면 원하는 정보를 검색하거나 수정하기가 불편해진다. 여러 데이터 사이의 관계를 관리하는 것도 어렵다.이런 문제를 해결하기 위해 데이터베이스를 사용한다.
지난 글에서는 JDBC로 MySQL에 연결하고 회원 데이터를 등록·조회·수정·삭제했다.그런데 서비스를 운영할 때는 회원이 탈퇴했다고 해서 데이터를 바로 지우지 않는 경우가 많다. 복구가 필요하거나 다른 데이터와의 관계를 유지해야 할 수도 있기 때문이다.이럴 때 데이터를
지난 글에서는 Status Enum과 Soft Delete를 이용해 데이터의 상태를 관리했다.이번에는 서로 다른 테이블에 저장된 데이터를 함께 조회해봤다. 저장소의 회원과 게시글 데이터를 이용해 JOIN의 역할과 조회 결과를 DTO에 담는 이유를 정리했다.회원 한 명은
JDBC 코드를 살펴보던 중 다음 코드를 발견했다.자동 커밋을 끄는 코드지만, 이후에 commit()이나 rollback()이 호출되지 않았다.트랜잭션은 단순히 자동 커밋을 끄는 것으로 끝나지 않는다. 작업을 확정할지 되돌릴지까지 직접 결정해야 한다.이번에는 저장소의
콘솔 프로그램은 main() 메서드에서 시작하지만, 웹 애플리케이션은 브라우저의 요청으로 시작한다.Java 웹 애플리케이션에서는 Servlet이 요청을 처리하고, JSP가 화면을 만든다.Servlet은 브라우저가 보낸 값을 읽고, 화면에 필요한 데이터를 준비한다.브라우
Servlet에서 요청을 처리한 뒤 JSP나 다른 Servlet으로 이동하는 방법은 크게 두 가지다.두 방식 모두 다른 화면으로 이동하는 것처럼 보이지만, 요청이 처리되는 과정은 완전히 다르다.핵심은 기존 request를 유지하는가, 새로운 request를 만드는가에
Servlet은 브라우저의 요청을 처리하고, JSP는 전달받은 데이터로 화면을 만든다.작은 기능에서는 이 정도 분리만으로도 충분하다. 하지만 회원가입, 로그인, 게시글 작성처럼 기능이 늘어나면 요청 처리, 데이터베이스 접근, 화면 이동 코드가 서로 섞이기 시작한다.이
자바에서 다른 객체가 필요하면 보통 new를 사용한다.Food를 만들기 위해 먼저 Knife를 생성하고, 생성된 객체를 Food에 전달했다. 코드도 단순하고 동작 방식도 쉽게 이해할 수 있다.그런데 스프링에서는 객체를 직접 생성하고 연결하는 작업을 개발자가 전부 담당하
앞에서는 스프링 컨테이너가 객체를 생성하고 필요한 곳에 주입해 준다는 것을 알아봤다.그런데 주입받으려는 타입의 Bean이 하나라면 문제가 없지만, 같은 타입의 Bean이 여러 개라면 이야기가 달라진다.이번에는 실제 실습 코드에 있는 Restaurant, Outback,
Servlet에서는 요청을 처리하기 위해 URL을 매핑하고, HttpServletRequest에서 값을 꺼낸 뒤 화면으로 전달해야 했다.스프링 MVC에서는 같은 흐름을 훨씬 간결하게 작성할 수 있다.짧은 코드지만 그 안에는 다음 과정이 모두 들어 있다.이번 글에서는 실
지난 글에서는 HTTP 메서드와 CRUD의 관계를 살펴봤다.그중 회원을 등록하는 코드는 다음과 같은 형태였다.클라이언트는 JSON을 보냈는데 컨트롤러에서는 MemberDTO라는 자바 객체를 사용하고 있다.스프링은 이 JSON을 어떻게 자바 객체로 바꾸는 걸까?이번 글에