자바로 개발을 하다 보면 가장 자주 발생하는 오류 중 하나가 NullPointerException 이다. (진짜...)

 

NullPointerException은 프로그램이 '값이 없다'는 상태인 null 값을 사용하려고 할 때 발생하는 오류이다. 정말 초보 개발자일때 뿐만 아니라 숙련이 되더라도 언제든 큰 골칫거리가 될 수 있다고 생각한다.

 

Kotlin은 이러한 문제를 근본적으로 해결하기 위해 Null Safety라는 개념을 도입했다. 

 

우선 Null에 대해서 정의를 해보자

 

 

Null이란 무엇인가?

Null은 "값이 없음"을 의미하는 특별한 값이다.

프로그래밍에서 어떤 변수에 값이 할당되지 않았거나, 사용할 수 없는 상태를 표현할 때 null을 사용한다. 예를 들어, 친구 목록을 저장하는 변수에 친구가 한 명도 없다면, 그 변수는 null일 수 있다.

var friend: String? = null // 친구가 없는 상태

 

여기서 중요한 점은 null을 허용하는 변수와 허용하지 않는 변수가 있다는 점이다.

 

만약 null인 값을 잘못 사용하면 프로그램은 오류를 내며 멈춰버릴 수 있다. 실제로, 많은 프로그래밍 오류는 이런 null 관련 문제에서 발생한다.

 

 

Kotlin의 Null Safety 기능

Kotlin은 변수 선언 시, 해당 변수가 null을 가질 수 있는지 여부를 명확하게 표시한다. 이를 통해 컴파일러가 자동으로 null 관련 오류를 사전에 경고해준다.

 

위에서 언급했던 Non-Nullable 변수와 Nullable 변수에 대해서 알아보자

  • Non-Nullable 변수 : 변수 선언 시에 기본적으로 null을 허용하지 않는다. 예를 들어, var name: String = "Alice" 라고 선언하면, 이 변수는 null 값을 가질 수 없다.
  • Nullable 변수 : 변수 뒤에 ?를 붙여 선언하면 null 값을 허용한다. 예를 들어, var friend: String? = null 이라고 선언하면, 이 변수는 null일 수도 있고, 실제 문자열 값을 가질 수도 있다.
fun main() {
    // Non-Nullable 변수: null 할당 불가
    var name: String = "Alice"
    // name = null  // 컴파일 에러 발생

    // Nullable 변수: null 할당 가능
    var friend: String? = null
    println("친구: $friend")
}

 

안전 호출 연산자 (?.)

Nullable 변수에 접근할 때, 직접 접근하면 null이 반환될 수 있어 오류가 발생할 수 있다. Kotlin에서는 안전 호출 연산아 "?." 를 사용하여 null일 때 안전하게 처리할 수 있다.

fun main() {
    var friend: String? = null
    // friend가 null이면 toUpperCase()를 호출하지 않고 전체 결과가 null로 처리됨
    println(friend?.toUpperCase())  // 출력: null

    friend = "Bob"
    println(friend?.toUpperCase())  // 출력: BOB
}

 

여기서 friend?.toUpperCase()는 friend가 null이 아니기 때문에 대문자로 변환하고, null이면 null을 그대로 반환한다.

 

 

엘비스 연산자 (?:)

안전 호출 연산자와 함께 엘비스 연산자 "?:" 를 사용하면, null인 경우에 기본 값을 제공할 수 있다.

fun main() {
    var friend: String? = null
    // friend가 null이면 "알 수 없음"을 대신 출력
    val friendName = friend ?: "알 수 없음"
    println("친구 이름: $friendName")
}

 

이 예제에서 friend가 null이기 때문에, "알 수 없음"이 friendName에 할당되어 출력된다.

 

 

let 함수

Kotlin에서는 null이 아닐 때만 특정 작업을 실행하는 간단한 방법으로 let 함수를 제공한다.

fun main() {
    var friend: String? = "Charlie"
    
    // friend가 null이 아닐 때만 블록 안의 코드 실행
    friend?.let {
        println("친구 이름 길이: ${it.length}")
    }
    
    friend = null
    // friend가 null이면 let 블록은 실행되지 않음
    friend?.let {
        println("이 코드는 실행되지 않습니다.")
    }
}

 

위처럼 let 함수는 nullable 변수가 null이 아닐 때 안전하게 해당 값을 사용할 수 있도록 도와준다.

1. 변수와 상수

Kotlin에서는 변수를 선언할 때 var 와 상수를 선언할 때 val 키워드를 사용한다.

  • var : 값이 변경 가능한 변수 
  • val : 값이 변경 불가능한 변수
fun main() {
    var age: Int = 20       // 가변 변수
    val name: String = "Alice"  // 불변 변수 (상수)

    println("이름: $name, 나이: $age")

    age = 21  // 값 변경 가능
    println("변경된 나이: $age")
}

 

 

2. 타입 추론

Kotlin은 변수의 타입을 자동으로 추론한다. 명시적으로 타입을 지정하지 않아도, 초기 값으로부터 타입을 유추할 수 있다.

fun main() {
    val language = "Kotlin"  // String 타입으로 추론됨
    val version = 1.5        // Double 타입으로 추론됨

    println("언어: $language, 버전: $version") // "언어 : Kotlin, 버전 : 1.5"
}

 

따라서 타입을 생략해도 컴파일러가 올바른 타입을 추론해주므로 코드가 간결해진다.

 

 

 

3. 문자열 템플릿

Kotlin에서는 문자열 내에서 변수 값을 쉽게 사용할 수 있는 문자열 템플릿 기능을 제공한다.

fun main() {
    val name = "Bob"
    val greeting = "안녕하세요, $name 님!"
    println(greeting)
}

 

문자열 내에 $name 과 같이 사용하면 해당 변수의 값이 문자열에 삽입된다.

 

 

 

4. 조건문

if 문

Kotlin의 if 문은 값으로 반환될 수 있어, 삼항 연산자 대신에 많이 사용된다.

fun main() {
    val score = 85
    val result = if (score >= 90) "합격" else "불합격"
    println("시험 결과: $result")
    
    
    // 식으로도 사용 가능
    val max = if( a > b) {
    	print("Choose a") // "Choose a" 를 출력하고 max에 a를 대입
        a
    } else {
    	print("Choose b") // "Choose b" 를 출력하고 max에 b를 대입
        b
    }
}

 

when 문

when 문은 여러 조건을 처리할 때 사용하며, Java의 switch 문보다 더 유연하다.

fun main() {
    val day = 3
    val dayName = when(day) {
        1 -> "월요일"
        2 -> "화요일"
        3 -> "수요일"
        4 -> "목요일"
        5 -> "금요일"
        6 -> "토요일"
        7 -> "일요일"
        else -> "알 수 없음"
    }
    println("오늘은 $dayName 입니다.")
    
    
    
    // 값 비교
    val x = 5

	when (x) {
    	1 -> println("x는 1이다")
    	2, 3 -> println("x는 2 또는 3이다")
    	in 4..10 -> println("x는 4와 10 사이에 있다")
    	else -> println("x는 다른 수이다")
	}
    
    
    // 타입 비교
    val data: Any = "Hello, World!"

    when (data) {
        is String -> println("data is a String: $data")
        is Int -> println("data is an Int: $data")
        is Boolean -> println("data is a Boolean: $data")
        else -> println("data is something else: $data")
    }


	// 조건식
    val y = 7

    val z = when {
        y == 5 -> "y는 5이다"
        y == 7 -> "y는 7이다"
    	else -> "y는 다른 수이다."
    }
    println(z)



}

 

 

 

5. 반복문

for 문

for 문은 컬렉션이나 범위(range)를 쉽게 순회할 수 있다.

fun main() {
    for (i in 1..5) {  // 1부터 5까지의 범위
        println("현재 값: $i")
    }
    
    val fruits = listOf("사과", "바나나", "체리")
    for (fruit in fruits) {
        println("과일: $fruit")
    }
}

 

 

while 문

기본적인 while 루프도 Java와 동일하게 사용할 수 있다.

fun main() {
    var count = 0
    while (count < 3) {
        println("카운트: $count")
        count++
    }
}

 

 

 

6. 함수

Kotlin에서 함수는 fun 키워드를 사용해 정의한다.

// 인사를 출력하는 함수
fun sayHello(name: String): String {
    return "안녕하세요, $name 님!"
}

fun main() {
    val message = sayHello("Charlie")
    println(message)
}

 

또, 함수의 몸체가 단 한줄이라면 중괄호와 return 키워드를 생략할 수도 있다.

fun add(a: Int, b: Int) = a + b

fun main() {
    println("5 + 3 = ${add(5, 3)}")
}

 

 

 

7. 클래스와 객체

Kotlin에서는 클래스를 사용해 객체 지향 프로그래밍을 할 수 있다. 

// Person 클래스 정의
class Person(val name: String, var age: Int) {
    fun introduce() = "제 이름은 $name이고, 나이는 $age살입니다."
}

fun main() {
    val person = Person("David", 30)
    println(person.introduce())
    
    // age 값 변경 가능 (var로 선언)
    person.age = 31
    println("나이 업데이트: ${person.age}")
}

 

Person 클래스를 정의하고, 생성자를 통해 name과 age 값을 초기화하며, 멤버 함수 introduce()로 자기소개를 한다.

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

Spring Boot Auto Configuration 이해해보기  (2) 2025.03.10
Kotlin의 Null Safety  (2) 2025.03.08
Spring Boot와 Kotlin: 기본 개념과 시작하기  (3) 2025.03.01
REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08

복잡한 시스템을 신속하고 안정적으로 구축하는 것이 중요하다고 생각한다. 이에 따라 개발 생산성과 유지보수성을 극대화할 수 있는 도구와 언어의 선택은 필수적이다. Spring Boot 와 Kotlin은 이런 요구에 부합하는 강력한 조합으로 주목받고 있다.

 

Spring Boot란 무엇인가?

Spring Boot는 전통적인 스프링 프레임워크의 복잡한 설정 문제를 해결하기 위해 나온 경량화된 프레임워크입니다.
주요 특징과 장점을 구체적으로 살펴보면:

1. 자동 구성 (Auto-Configuration)

  • 설정의 단순화:
    Spring Boot는 애플리케이션 시작 시 프로젝트의 클래스패스와 설정 파일을 기반으로 자동으로 적절한 빈(Bean)들을 구성합니다.
    이는 개발자가 일일이 XML이나 복잡한 자바 설정을 작성할 필요 없이 비즈니스 로직에 집중할 수 있도록 도와줍니다.
  • 스프링 부트 스타터 (Starters):
    다양한 기능별 스타터 패키지를 제공하여, 의존성 관리가 간단하고, 필요한 라이브러리를 일괄 추가할 수 있습니다. 예를 들어, 웹 애플리케이션을 위한 spring-boot-starter-web이나 데이터베이스 연동을 위한 spring-boot-starter-data-jpa 등이 있습니다.

2. 독립 실행형 애플리케이션

  • 내장 서버:
    Tomcat, Jetty 등 내장 웹 서버가 포함되어 있어 별도의 서버 설치나 설정 없이 바로 실행할 수 있습니다.
    이로 인해 배포가 용이하고, 초기 개발 및 테스트 환경 구축이 신속해집니다.
  • 실행 파일:
    Spring Boot 애플리케이션은 단일 JAR 파일로 패키징되어, 명령어 한 줄로 실행할 수 있어 운영 환경에 배포하기 편리합니다.

3. 생산성과 유지보수성

  • 간결한 설정:
    복잡한 XML 설정이나 방대한 보일러플레이트 코드를 제거하여, 코드의 가독성과 유지보수성을 높입니다.
  • 모듈화 및 확장성:
    필요한 기능만 선택적으로 사용할 수 있도록 설계되어, 프로젝트가 커져도 쉽게 확장할 수 있습니다.

 

Kotlin의 기본 개념

Kotlin은 JetBrains에서 개발한 현대적인 프로그래밍 언어로, Java와 100% 호환되면서도 코드의 간결성과 안정성을 극대화합니다.
주요 개념과 특징은 다음과 같습니다.

1. 간결한 문법

  • 타입 추론:
    Kotlin은 변수 선언 시 타입을 명시하지 않아도 자동으로 타입을 추론하여 코드의 길이를 줄여줍니다.
    예를 들어, val name = "Kotlin"처럼 간단하게 선언할 수 있습니다.
  • 함수형 프로그래밍 지원:
    람다식, 고차 함수, 컬렉션 처리 등의 기능을 기본 제공하여, 반복적이거나 복잡한 로직을 짧고 명확하게 표현할 수 있습니다.
  • 데이터 클래스:
    단순히 데이터를 저장하기 위한 클래스를 작성할 때, data class 키워드를 사용하면 equals(), hashCode(), toString() 등 유용한 메서드를 자동 생성해 줍니다.

2. Null 안전성 (Null Safety)

  • 컴파일 단계에서의 검사:
    Kotlin은 Null에 안전한 타입 시스템을 도입하여, NullPointerException을 사전에 방지할 수 있습니다.
    변수에 ?를 붙여 Nullable 타입을 지정하는 방식으로, 코드 작성 시 Null 처리를 명확하게 할 수 있습니다.
  • 엘비스 연산자와 안전 호출:
    ?.와 ?: 등의 연산자를 사용하여 Null 체크를 간편하게 할 수 있어, 코드의 안정성을 높입니다.

3. 확장 함수와 프로퍼티

  • 기존 클래스에 기능 추가:
    확장 함수를 사용하면, 기존 클래스의 소스 코드를 수정하지 않고도 새로운 메서드를 추가할 수 있습니다.
    이를 통해 코드의 재사용성과 가독성을 크게 향상시킬 수 있습니다.
  • 프로퍼티 확장:
    확장 프로퍼티를 통해 기존 클래스에 새로운 속성을 추가하는 방식으로, 코드의 유연성을 높입니다.

4. 상호 운용성

  • Java와의 완벽한 호환:
    Kotlin은 JVM 언어로, Java 라이브러리와 자연스럽게 통합됩니다.
    기존의 Java 기반 프로젝트에 Kotlin을 점진적으로 도입할 수 있으며, 두 언어의 장점을 모두 활용할 수 있습니다.

 

왜 Spring Boot와 Kotlin을 함께 배워야 할까?

두 기술을 결합하여 학습하면 다음과 같은 여러 가지 장점이 있습니다.

1. 개발 생산성 향상

  • 간결함과 효율성 극대화:
    Kotlin의 간결한 문법과 null 안전성 덕분에 코드 작성 시간이 단축되고, 오류 가능성이 줄어듭니다.
    Spring Boot의 자동 구성과 스타터 패키지 기능은 복잡한 환경 설정을 단순화하여 개발 초기 진입 장벽을 낮춥니다.
  • 빠른 프로토타입 제작:
    두 기술 모두 빠른 애플리케이션 개발에 최적화되어 있어, 아이디어를 신속하게 구현하고 테스트할 수 있습니다.

2. 최신 개발 트렌드 반영

  • 모던한 언어와 프레임워크:
    Kotlin은 함수형 프로그래밍 패러다임을 포함한 최신 언어 기능들을 제공하며, Spring Boot는 클라우드 및 마이크로서비스 아키텍처에 적합한 설계 방식을 채택하고 있습니다.
  • 지속적인 업데이트와 커뮤니티 지원:
    두 기술 모두 활발한 커뮤니티와 정기적인 업데이트를 통해 최신 개발 트렌드를 반영하고 있어, 미래에도 경쟁력을 유지할 수 있습니다.

3. 안정성과 확장성

  • 코드의 안정성 강화:
    Kotlin의 컴파일 타임 Null 검사 및 안전한 타입 시스템은 런타임 오류를 줄여줍니다.
    Spring Boot의 모듈화된 아키텍처는 애플리케이션이 성장해도 체계적인 관리와 확장이 용이합니다.
  • 비즈니스 로직의 효과적 관리:
    Kotlin의 함수형 프로그래밍 기법과 확장 함수를 활용하면 복잡한 비즈니스 로직을 명확하고 직관적으로 관리할 수 있습니다.

4. 커뮤니티와 생태계의 장점

  • 풍부한 학습 자료와 오픈소스 프로젝트:
    Spring Boot와 Kotlin 모두 전 세계적으로 활발한 커뮤니티가 존재하며, 수많은 튜토리얼, 샘플 코드, 오픈소스 프로젝트가 학습에 큰 도움을 줍니다.
  • 실무 적용 사례:
    많은 기업과 스타트업들이 이미 이 조합을 채택해, 신속한 개발과 유지보수, 높은 확장성을 경험하고 있습니다. 실제 사례를 참고하면, 기술 선택의 타당성을 쉽게 이해할 수 있습니다.

 

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

Kotlin의 Null Safety  (2) 2025.03.08
Kotlin 기본 문법  (1) 2025.03.05
REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08
Post API  (0) 2023.11.02

REST(Representational State Transfer) 란 무엇일까?

REST는 분산 시스템을 위한 아키텍쳐 스타일 중 하나이다. 리소스를 표현하고 해당 리소스에 대한 상태를 전송하는 데 사용된다. 웹 서비스의 디자인에 널리 사용되며, 클라이언트와 서버 간의 통신을 위한 규칙과 제약을 정의한다.

 

REST의 주요 특징

 

1. Client-Server Architecture (클라이언트-서버 아키텍쳐) 

  클라이언트와 서버가 서로 독립적으로 개발되고 확장될 수 있도록 설계된다. 이를 통해 서버와 클라이언트의 역할을 분리하여 시스템의 유연성을 향상시킨다.

 

2. Statelessness (무상태성)

  각 요청은 클라이언트의 모든 정보를 포함하며, 서버에서 클라이언트의 상태를 유지하지 않는다. 이는 서버측의 부하를 줄이고 확장성을 향상시킨다.

 

3. Cacheability (캐시 가능성)

  HTTP 프로토콜을 사용하여 데이터를 캐싱할 수 있도록 한다. 이는 서버의 부하를 줄이고 네트워크 성능을 향상시킨다.

 

4. Uniform Interface (일관된  인터페이스)

  리소스에 대한 표현과 상호작용 방법이 일관성 있게 정의되어야 한다. 이를 통해 시스템의 분리성을 유지하고 상호 운용성을 향상시킨다.

 

5. Layered System (계층화 시스템)

  클라이언트는 서버와 직접 통신하는 대신, 중간에 프록시나 캐시 서버 등을 통해 통신할 수 있다. 이는 시스템의 확장성과 보안을 향상시킨다.

 

 

REST의 요소

 

1. 리소스(Resource)

  데이터를 나타내는 개체이다,. 모든  리소스는 고유한 URI(Uniform Resource Identifier)로 식별된다.

 

2. 메서드(Method) 

  HTTP 메서드 (GET,POST,PUT,DELETE 등)를 사용하여 리소스에 대한 행동을 정의한다.

 

3. 메시지(Message) 

  클라이언트와 서버 간의 통신에 사용되는 데이터이다. 일반적으로 JSON 또는 XML 형식으로 표현된다.

 

4. 표현(Representation) 

  클라이언트가 리소스에 접근할 때 얻는 데이터의 형식을 나타낸다. 일반적으로 JSON 또는 XML 형식으로 표현된다.

 

요약하자면 REST는 웹 서비스 및 분산 시스템의 디자인에 널리 사용되며, 간단하고 유연한 아키텍쳐 스타일을 제공하여 시스템의 확장성과 상호 운용성을 향상시킨다.

 

 

 

 

RESTful

RESTful은 REST 아키텍쳐 스타일을 따르는 웹 서비스를 설계하고 구현하는 방법을 의미한다. 즉 RESTful 한 웹 서비스는 REST의 원리와 제약을 준수하여 개발된 웹 서비스를 말한다. 클라이언트와 서버 간의 상호 작용을 위해 HTTP 프로토콜을 기반으로 하며, 자원을 표현하고 그 상태를 전송하기 위해 표준 HTTP 메서드 (GET,POST,PUT,DELETE 등)를 사용한다.

 

 

RESTful 웹 서비스의 장점

 

1. 간결한 인터페이스 

  HTTP 프로토콜을 사용하여 간단하고 직관적인 API 를 제공한다.

 

2. 유연성 

  다양한 플랫폼 및 기기에서 사용할 수 있으며, 다양한 데이터 형식을 지원한다 ex) 웹, 모바일 등 여러 시스템에서 사용 가능 

 

3. 확장성 

  클라이언트와 서버 간의 분리로 확정성이 향상된다.

 

4. 상호 운용성

  다른 시스템과의 통합이 쉽고 간단하다

 

5. 자유로운 사용

  웹 기술과 상호 운용이 용이하므로 다양한 언어와 프레임 워크로 개발할 수 있다.

 

 

그렇다면 예시를 통해  REST API 에 대해서  알아보자

 

REST API

REST API 설계 시 가장 중요한 항목은 다음의 2가지로 요약할 수 있다.

 

1. URI는 정보의 자원표현해야 한다.

2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE) 로 표현한다.

 

 

- URI는 정보의 자원을 표현해야 한다. *리소스명은 동사보다는 명사를 사용해야 한다.

GET /members/delete/1

 

위와 같은 방식은 REST를 제대로 적용하지 않은 URI이다. URI는 자원을 표현하는데 중점을 두어야 한다. 행위에 대한 표현이 들어가서는 안된다.

 

자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE) 로 표현한다,.

위의 잘못 된 URI를 HTTP Method를 통해 수정해 보면

DELETE /members/1

 

 

이와 같이 수정할 수 있다. 

 

어떠한 정보를 가져올때는 GET, 회원 추가, 수정 등 행위를 표현하고자 할 때는 POST Method를 사용하여 표현할 수 있다.

 

회원정보를 가져오는 URI

GET /members/show/1 (x)
GET /members/1      (o)

 

회원을 추가할 때

GET /members/insert/2  (x) - GET 메서드는 리소스 생성에 맞지 않다.
POST /members/2 	   (o)

 

제품관리 

GET /products 		-- 모든 제품 목록을 가져온다
GET /products/{id}	-- 특정 제품의 정보를 가져온다
POST /products		-- 새로운 제품을 생성한다
PUT /products/{id}	-- 특정 제품의 정보를 업데이트한다
DELETE /products/{id} -- 특정 제품을 삭제한다

 

HTTP Method

 

URI 설계 시 주의할 점

 

1. 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용한다.

2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다.

3. 하이픈(-)은 URI 가독성을 높이는데 사용 (불가피하게 긴 URI 경로를 가지게 된 경우)

4. 밑줄(_)은 URI에 사용하지 않는다.

5. URI 경로에는 소문자가 적합하다.

6. 파일 확장자는 URI에 포함시키지 않는다. (Accept Header 를 사용한다)

 

 

HTTP 응답코드

HTTP 상태코드

 

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

Kotlin 기본 문법  (1) 2025.03.05
Spring Boot와 Kotlin: 기본 개념과 시작하기  (3) 2025.03.01
Swagger  (0) 2023.11.08
Post API  (0) 2023.11.02
Spring Boot 기초  (0) 2023.11.01

Swagger

- 협업을 위해 필요한 라이브러리

- 서버로 요청되는 API 리스트를 HTML 화면으로 문서화하여 테스트 할 수 있는 라이브러리

- 서버가 가동되면서 @RestController를 읽어 API를 분석하여 HTML 문서를 작성한다.

 

Swagger가  필요한 이유

- REST API의 스펙을 문서화 하는 것은 매우 중요하다. API를 변경할 때마다 Reference 문서를 계속 바꿔야하는 불편함이 있다.

 

Swagger 설정 방법

@Configuration : 어노테이션 기반의 환경 구성을 돕는 어노테이션 IoC Container에게 해당 클래스를 Bean 구성 Class 임을 알려준다.

 

@Bean : 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들 경우에 사용

 

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

Spring Boot와 Kotlin: 기본 개념과 시작하기  (3) 2025.03.01
REST 와 RESTful  (0) 2024.02.07
Post API  (0) 2023.11.02
Spring Boot 기초  (0) 2023.11.01
REST API  (2) 2023.10.30

리소스를 추가하기 위해 사용되는 API

@PostMapping : POST API를 제작하기 위해 사용되는 어노테이션 @RequestMapping + POST method의 조합이다.

일반적으로 추가 하고자 하는 Resouce를 http body에 추가하여 서버에 요청한다. 그렇기 때문에 @RequestBody를 이용하여 body에 담겨있는 값을 받아야 한다.

 

// http://localhost:8080/api/test/vi/post-api/member
// 해당 URL로 member 데이터를 넘겨주면 해당 데이터의 키값과 value값을 return 하는 예제
@PostMapping(value="/member")
public String postMember(@RequestBody Map<String, Object> postData) {
	StringBuilder sb = new StringBuilder();
    
    postData.entrySet().forEach(map -> {
    	sb.append(map.getKey() + ":" + map.getValue() + "\n");
    });
    
    return sb.toString();
}





// DTO를 사용하는 방식
// key와 value가 정해져있지만, 받아야할 파라미터가 많을 경우 DTO객체를 사용한다.
// GetMapping 과 다른점은 @RequestBody를 꼭 붙여야 한다는 것이다.
@PostMapping(value-"/member2")
public String postMemberDto(@RequestBody MemberDto memberDto) {
	return memberDto.toString();
}

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08
Spring Boot 기초  (0) 2023.11.01
REST API  (2) 2023.10.30
Maven 과 Gradle  (0) 2023.10.29

컨트롤러 (Controller)

모델(Model)과 뷰(View) 사이에서 브릿지 역할을 수행한다. 앱의 사용자로부터 입력에 대한 응답으로 모델 및 뷰를 업데이트 하는 로직을 포함하여 사용자의 요청은 모두 컨트롤러를 통해 진행되어야 한다. 컨트롤러로 들어온 요청은 모델이 어떻게 처리할지 결정하여 모델로 요청을 전달한다.

 

@RestController

  • Spring Framework 4 버전부터 사용가능한 어노테이션
  • @Controller에 @ResponseBody가 결합된 어노테이션
  • 컨트롤러 클래스 하위 메소드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있음
  • View를 거치지 않고 HTTP ResponseBody에 직접 Return 값을 담아 보내게 된다.

 

 

@RquestMapping

MVC의 핸들러 매핑(Handler Mappin)을 위해서 DefaultAnnotationHandlerMapping을 사용한다. DefaultAnnotationHandlerMapping 매핑정보로 @RequestMapping 어노테이션을 활용 클래스와 메소드의 RequestMapping을 통해 URL을 매핑하여 경로를 설정하여 해당 메소드에서 처리한다.

 

value : url 설정

method : GET, POST, DELETE, PUT, PATCH 등

 

스프링 4.3버전 부터 메소드를 지정하는 방식보다 간단하게 사용할 수 있는 어노테이션을 사용할 수 있음

  • @GetMapping
  • @PostMapping
  • @DeleteMapping
  • @PutMapping
  • @PatchMapping

 

 

 

 

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08
Post API  (0) 2023.11.02
REST API  (2) 2023.10.30
Maven 과 Gradle  (0) 2023.10.29

API 란?

Application Programming Interface 의 줄임말

응용 프로그램에서 사용할 수 있도록 다른 응용 프로그램을 제어할 수 있게 만든 인터페이스를 뜻한다. API를 사용하면 내부 구현 로직을 알지 못해도 정의되어 있는 기능을 쉽게 사용할 수 있다.

 

인터페이스(Interface)란 어떤 장치간 정보를 교환하기 위한 수단이나 방법을 의한다. 대표적인 예로는 마우스, 키보드, 터치패드 등이 있다.

 

REST 란?

REST는 Representational State Transfer의 줄임말

자원의 이름으로 구분하여 해당 자원의 상태를 교환하는 것을 의미한다. REST는 서버와 클라이언트의 통신 방식 중 하나이다.

HTTP URI(Uniform Resource Identifier)를 통해 자원을 명시하고 HTTP Method를 통해 자원을 교환하는 것이다.

*HTTP Method : Create, Read, Update, Delete

 

REST 의 특징 

1. Server-Client 구조

  자원이 있는 쪽이 Server, 요청하는 쪽이 Client 

  클라이언트와 서버가 독립적으로 분리되어 있어야 한다.

 

2. Stateless

  요청 간에 클라이언트 정보가 서버에 저장되지 않아야 한다.

  서버는 각각의 요청을 완전히 별개의 것으로 인식하고 처리해야 한다.

 

3. Cacheable

  HTTP 프로토콜을 그대로 사용하기 때문에 HTTP의 특징인 캐싱 기능을 적용하였다.

  대량의 요청을 효율적으로 처리하기 위해 캐시를 사용한다.

 

4. 계층화 (Layered System)

  클라이언트는 서버의 구성과 상관 없이 REST API 서버로 요청.

  서버는 다중 계층으로 구성될 수 있다.(로드밸런싱, 보안 요소, 캐시 등)

 

5. Code on Demand

  요청을 받으면 서버에서 클라이언트로 코드 또는 스크립트를 전달하여 클라이언트 기능 확장

 

6. 인터페이스 연관성(Uniform Interface)

  정보가 표준 형식으로 전송되기 위해 구성 요소간 통합 인터페이스를 제공한다.

  HTTP 프로토콜을 따르는 모든 플랫폼에서 사용 가능하게끔 설계

 

 

REST 의 장점

 HTTP 표준 프로토콜을 사용하는 모든 플랫폼에서 호환 가능하다.

 서버와 클라이언트의 역할을 명확하게 분리해준다.

 여서 서비스 설계에서 발생하는 문제점을 최소화 해준다.

 

 

REST API 란?

 REST 아키텍쳐의 조건을 준수하는 어플리케이션 프로그래밍 인터페이스를 뜻한다. 

최근 많은 API 가 REST API로 제공되고 있다. 일반적으로 REST 아키텍쳐를 구현하는 웹 서비스를 RESTful 하다고 표현한다.

 

 

REST API 특징

REST 기반으로 시스템을 분산하여 확장성과 재사용성을 높인다. HTTP 표준을 따르고 있어 여러 프로그래밍 언어로 구현할 수 있다.

 

REST API 설계 규칙

1. 웹 기반의 REST API를 설계할 경우에는 URI 를 통해 자원을 표현해야 한다.

  ex ) https://thinkground.studio/member/589   

       Resource : member

       Resource id : 589

 

2. 자원에 대한 조작은 HTTP Method(CRUD)를 통해 표현해야 한다.

  URI 에 행위가 들어가서는 안되고, HEADER를 통해 CRUD를 표현하여 동작을 요청해야 한다.

 

3. 메세지를 통한 리소스 조작

  HEADER를 통해 content-type을 지정하여 데이터를 전달한다. 대표적 형식으로는 HTML, XML, JSON, TEXT 가 있다.

 

4. URI에는 소문자를 사용한다.

 

5. Resource의 이름이나 URI가 길어질 경우 하이픈(-)을 통해 가독성을 높일 수 있다.

 

6. 언더바(_)는 사용하지 않는다.

 

7. 파일 확장자를 표현하지 않는다.

 

 

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08
Post API  (0) 2023.11.02
Spring Boot 기초  (0) 2023.11.01
Maven 과 Gradle  (0) 2023.10.29

빌리 관리 도구란?

프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구 

소스 코드를 컴파일, 테스트, 정적분석 등을 하여 실행가능한 앱으로 빌드해줌

프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업을 진행해줌

외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트의 관리해줌 

 

자바의 대표적인 빌드도구 : Ant, Maven, Gradle

 

 

메이븐 (Maven) 이란?

자바의 대표적인 관리 도구였던 Ant를 대체하기 위해 개발됨

프로젝트의 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 명시하여 관리 

참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨

 

메이븐을 사용하는 이유 

기존에 사용하던 Ant는 빌드의 기능만 가지고 있음

자동으로 라이브러리를 관리해주는 기능이 추가된 Maven을 사용

다운받아 사용하던 라이브러리에 변동 사항이 있으면 자동으로 업데이트 하여 적용됨

 

Ant

  • XML 기반의 빌드 스크립트
  • 자유로운 빌드 단위 지정
  • 간단하고 사용하기 쉬움
  • 대규모 프로젝트에서 복잡해지는 경향이 있음
  • 라이프 사이클이 없음

 

Maven

  • XML 기반의 빌드 스크립트
  • 라이프 사이클 도입
  • pom.xml로 편하게 Dependency 관리
  • 대규모 프로젝트에서 복잡해지는 경향이 있음
더보기

pom.xml의 역할

- 프로젝트 정보 관리

- 해당 프로젝트에서 사용하는 외부 라이브러리 관리

- 해당 프로젝트의 빌드 관련 설정

 

Maven의 대표 태그 설명

  • modelVersion : maven의 버전을 의미
  • groupId : 프로젝트 그룹 id를 뜻하며, 일반적으로 대표하는 사이트 도메인을 역순으로 적어 사용
  • artifactId : groupId외에 다른 프로젝트와는 구분될 수 있는 프로젝트의 id를 작성
  • version : 프로젝트의 버전을 의미하며 개발 단계에 따라 구분하여 작성
  • name : 프로젝트의 이름
  • description : 해당 프로젝트의 간략한 설명을 작성
  • properties : pom.xml 파일 내에서 빈번하게 사용되는 중복 상수를 정의하는 영역 해당 영역의 상수를 사용하기 위해서는 ${태그명} 의 형태로 사용한다.
  • dependendies : 해당 프로젝트에서 의존성을 가지고 사용하는 라이브러리를 정의하는 영역 각 라이브러리마다 <dependency> 태그를 사용하여 구분
  • build : 프로젝트 빌드와 관련된 정보를 설정하는 영역

 

Gradle 이란?

Groovy 스크립트를 활용한 빌드 관리 도구

안드로이드 프로젝트의 표준 빌드 시스템으로 채택

멀티 프로젝트(Multi-Project)의 빌드에 최적화 하여 설계됨

Maven에 비해 더 빠른 처리속도를 가지고 있음

Maven에 비해 더 간결한 구성이 가능함

 

Gradle과 Maven 비교

  • Gradle에 비해 Maven이 점유율이 더 높은 상황(점차 Gradle 점유율이 오르는 중)
  • Gradle에 비해 Maven 성능이 떨어짐
  • Maven에 비해 Gradle이 대규모 프로젝트에서의 성능이 좋음
  • Mavne : pom.xml  Gradle : build.gradle
  • Gradle은 설치 없이 사용할 수 있다. 

Gradle 대표 용어 설명

  • repositories : 라이브러리가 저장된 위치 등 설정
  • mavenCentral : 기본 Maven Repository
  • dependencies : 라이브러리 사용을 위한 의존성 설정

'Back-End > Spring Boot + Kotlin' 카테고리의 다른 글

REST 와 RESTful  (0) 2024.02.07
Swagger  (0) 2023.11.08
Post API  (0) 2023.11.02
Spring Boot 기초  (0) 2023.11.01
REST API  (2) 2023.10.30

+ Recent posts