2. README.md가 위치하는 Repository에 .github 폴더를 만들고, 그 안에다가 또 workflows 라는 폴더 만들기
3. blog-post-workflow.yml 라는 파일에 아래 코드 붙여넣기
name: Latest blog post workflow
on:
schedule: # Run workflow automatically
- cron: '0 * * * *' # Runs every hour, on the hour
workflow_dispatch: # Run workflow manually (without waiting for the cron to be called), through the GitHub Actions Workflow page directly
permissions:
contents: write # To write the generated contents to the readme
jobs:
update-readme-with-blog:
name: Update this repo's README with latest blog posts
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Pull in dev.to posts
uses: gautamkrishnar/blog-post-workflow@v1
with:
feed_list: "https://dev.to/feed/gautamkrishnar,https://www.gautamkrishnar.com/feed/"
4. 맨 아래 feed_list: 에 본인의 블로그 rss 주소 넣기. 티스토리의 경우, 본인의 블로그 맨 끝에 /rss를 붙이면 됩니다. 예를 들어, https://bezzang2.tistory.com/rss
단, 티스토리에 블로그 설정>관리>블로그 에 Rss 설정을 적절히 해주셔야 합니다.
5. Actions 탭에, Latest blog post workflow에 들어가서 Re-run all jobs(또는 Run workflow) 클릭해서 새로고침 하면 끝
프로그래밍에서 예외(Exception)란 입력 값의 처리가 불가능하거나 참조된 값이 잘못된 경우 등 애플리케이션이 정상적으로 동작하지 못하는 상황을 의미합니다. 예외는 개발자가 직접 처리할 수 있으므로 미리 코드 설계를 통해 처리할 수 있습니다.
에러(Error)란 예외와 비슷한 의미지만 엄연히 다른 용어로, 에러는 주로 자바의 가상머신(JVM)에서 발생시킵니다. 따라서 예외와 달리 애플리케이션에서 처리할 수 있는 것이 없습니다. 대표적인 예로 메모리 부족(OutOfMemory), 스택 오버플로(StackOverFlow)가 있습니다. 이러한 에러는 발생 시점에 처리하는 것이 아니라 미리 애플리케이션의 코드를 살펴보면서 문제가 발생하지 않도록 예방해서 원천적으로 차단해야 합니다.
예외 클래스
자바에서 모든 예외 클래스는 Throwable 클래스를 상속받습니다. Exception 클래스는 크게 Checked Exception, UncheckedException이 있습니다. 위에서 파란 점선 내부에 있는 Exception이 Checked Exception, 주황색 점선 내부에 있는 Exception이 UncheckedException 입니다.
Checked Exception은 컴파일 단계에서 확인 가능한 예외 상황입니다. 이러한 예외는 IDE에서 캐치해서 반드시 예외 처리를 할 수 있게 표시해줍니다. 반면 Unchecked Exception은 런타임 단계에서 확인되는 예외 상황을 나타냅니다. 즉, 문법상 문제는 없지만 프로그램이 동작하는 도중 예기치 않은 상황이 생겨 발생하는 예외를 의미합니다. RuntimeException을 상속받는 Exception 클래스는 Unchecked Exception이고 그렇지 않은 Exception 클래스는 Checked Exception입니다.
예외 처리 방법
예외가 발생했을 때 이를 처리하는 방법은 크게 세 가지가 있습니다.
예외 복구
예외 처리 회피
예외 전환
예외 복구
예외 복구 방법은 예외 상황을 파악해서 문제를 해결하는 방법입니다. 대표적인 방법이 try/catch구문입니다. try 블록에는 예외가 발생할 수 있는 코드를 작성합니다. 그리고 catch블록을 거치면서 예외 유형과 매칭되는 블록을 찾아 예외 처리 동작을 수행합니다.
public class UserInputExample {
public static void main(String[] args) {
String userInput = "123abc"; // Simulate user input that might not be a number
try {
int age = Integer.parseInt(userInput); // Attempt conversion
System.out.println("Your age is: " + age);
} catch (NumberFormatException e) {
System.err.println("Error: Invalid age format. Please enter a number.");
}
}
}
예외 처리 회피
이 방법은 예외가 발생한 시점에서 바로 처리하는 것이 아니라 예외가 발생한 메서드를 호출한 곳에서 에러 처리를 할 수 있게 전가하는 방식입니다. 이때 throw키워드를 사용해 어떤 예외가 발생했는지 호출부에 내용을 전달할 수 있습니다.
public class ValidateAge {
public static void checkAge(int age) throws InvalidAgeException {
if (age < 0) {
throw new InvalidAgeException("Age cannot be negative!");
}
System.out.println("Your age is valid.");
}
public static void main(String[] args) {
try {
checkAge(-5); // This will throw an InvalidAgeException
} catch (InvalidAgeException e) {
System.err.println(e.getMessage());
}
}
}
class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message); // Call superclass constructor to set the message
}
}
예외 전환
이 방법은 앞의 두 방식을 적절하게 섞은 방식입니다. 예외가 발생했을 때 어떤 예외가 발생했느냐에 따라 호출부로 예외 내용을 전달하면서 좀 더 적합한 예외 타입으로 전달할 필요가 있습니다. 또는 애플리케이션에서 예외 처리를 좀 더 단순하게 하기 위해 래핑(wrapping)해야 하는 경우도 있습니다. 이런 경우에는 try/catch 방식을 사용하면서 catch 블록에서 throw키워드를 사용해 다른 예외 타입으로 전달하면 됩니다.
참고
스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022
컴파일 타임은 사람이 작성한 소스 코드가 컴퓨터가 이해할 수 있는 기계어로 번역되는 단계입니다. 자바의 컴파일러는 이 단계에서 문법적 에러를 확인합니다. (e.g., missing semicolons, typos, incorrect syntax) 만약 어떤 문제도 발생하지 않으면, 자바 컴파일러(e.g., javac)는 bytecode를 생성합니다.
bytecode는 기계어는 아니지만, JVM(Java Virtual Machine)에 의해 해석될 수 있습니다.
또한 아래와 같은 일들이 수행됩니다.
데이터 유형 호환성 확인
클래스 및 방법이 올바르게 선언되었는지 확인
런타임(Runtime)
런타임은 컴파일된 코드(bytecode)가 JVM(Java Virtual Machine)에 의해 실행되는 단계입니다.
다음과 같은 순서로 실행됩니다.
JVM은 메모리로 bytecode를 로드합니다.
JVM은 bytecode를 해석하고 명령어를 순차적으로 실행합니다.
실행하는 동안에 runtime errors를 발생시킬 수 있습니다. (e.g., OutOfInDex, division by zero)
이 단계에서는 다음과 같은 일이 발생합니다.
객체를 메모리에 할당합니다.
연산을 수행합니다.
운영체제와 외부 리소스와 상호작용합니다.
요약
Feature
Compile Time
Runtime
Definition
Source code is translated into machine code.
Machine code is interpreted and executed.
What happens
Syntax and code structure are checked; bytecode is generated.
Bytecode instructions are interpreted and executed.
Tools involved
Java compiler (e.g., javac)
Java Virtual Machine (JVM)
Actions performed
Checking for syntax errors, type compatibility, etc.
Executing code, allocating memory, interacting with resources
Error handling
Catches syntax errors
Catches runtime errors (e.g., division by zero)
Key points to remember
컴파일 타임에서는 프로그램이 실행되기 전 한 번만 발생합니다. Compile time happens once before the program is executed.
런타임은 프로그램이 실행될 때마다 계속해서 발생합니다. (코드 한줄한줄의 명령어를 실행할 때라고 생각하면 됩니다.) Runtime happens every time the program is run.
'ADT'는 추상 자료형을 의미하며 개념적으로 어떤 동작이 있는지만 정의하고, 구현에 대해서는 다루지 않는다.
'DS'는 자료구조로, 'ADT'에서 정의된 동작을 실제로 구현한 것
Stack과 Queue는 'ADT'를 실제로 구현한 자료 구조이다.
스택(Stack)과 큐(Queue)
스택은 'Last-In-First-Out' 형태로 데이터를 저장하는 구조
데이터를 삽입하는 'push', 데이터를 뽑아내고 삭제하는 'pop', 가장 마지막에 들어온 요소를 추출하는 'peek'과 같은 동작이 있다.
Queue는 'First-In-First-Out' 형태로 데이터를 저장하는 구조이며, 데이터를 삽입하는 'enqueue', 추출하는 'dequeue' 동작이 있다.
Queue라는 항상 'FIFO'를 의미하진 않는다. OS(Operating System)에서 멀티태스킹을 할 때 사용되는 '레디 큐(Ready Queue)'와 '오퍼스 트윈 폴스(Operating System Twins Pulse)' 등 다양한 대기열을 의미하는 것으로, 역할에 따라 상이한 용어가 사용된다.
스택(Stack)의 사용 사례
Stack Memory
Stack Memory라는 메모리 영역으로, 함수가 호출될 때 Stack Frame이 쌓이고, 종료될 때 Stack Frame이 사라지는 구조로 동작한다. 자바 개발 시 스택 오버플로(Stack Overflow) 같은 에러가 발생할 수 있는데, 이는 스택 메모리 공간이 다 차서 발생하는 에러다. 보통 재귀함수에서 탈출을 못할때 발생하는 경우가 많다.
큐(Queue)의 사용 사례
Producer/Consumer Architecture
프로듀서가 생산한 아이템이 차례대로 큐에 쌓이고 도착 순서에 따라 처리된다.
Heap memory
힙 메모리(Heap memory)는 주로 객체를 저장하는 메모리 영역인데, OutOfMemoryError는 힙 메모리가 다 채워진 상태에서 메모리를 더 필요로 할 때 발생한다. 따라서 Queue 사이즈를 고정하여 메모리 사용을 제한하는 것이 중요하다. OutOfMemoryError가 발생할 경우 대응할 수 있는 4가지 방식이 있다.
Exception 던지기
특별한 값(Null or false)을 반환
성공할 때까지 영원히 스레드 블락(block)
제한된 시간만 블락되고 그래도 안되면 포기
이러한 4가지 방식을 구현한 Queue 클래스는 Java에서 LinkedBlockingQueue가 있다.