Framework/Spring

[Spring] Spring Boot 환경설정 가이드

Joonfluence 2024. 9. 23.

1. Spring Initializr 활용하여 Spring Boot 프로젝트 생성하기

1.1 프로젝트 정보(스펙) 설정하기

Spring Initializr는 Spring Boot 프로젝트를 빠르고 쉽게 생성할 수 있는 도구입니다. 먼저, Spring Initializr 웹 사이트에 접속합니다. 다음은 프로젝트 설정의 각 요소에 대한 설명입니다.

  • Project: Maven 또는 Gradle 빌드 시스템 중 하나를 선택합니다. 일반적으로 Gradle을 많이 사용합니다.
  • Language: Java, Kotlin, Groovy 중 선택합니다. 대부분 Java를 선택합니다. 
  • Spring Boot Version: 최신 버전 또는 안정적인 버전을 선택하는 것이 좋습니다.
  • Project Metadata:
    • Group: 보통 패키지 네임의 첫 부분으로, 일반적으로 도메인 이름을 뒤집은 형태로 사용합니다 (예: com.example).
    • Artifact: 프로젝트의 이름을 지정합니다.
    • Name: 프로젝트의 이름이 자동으로 입력되며, 필요에 따라 수정 가능합니다.
    • Description: 프로젝트에 대한 간단한 설명을 입력합니다.
    • Package Name: 자동으로 입력되며, 그룹과 아티팩트를 기반으로 합니다.
    • Packaging: Jar 또는 War 중 선택합니다. 대부분의 경우는 Jar로 설정합니다.
    • Java Version: 사용하려는 JDK 버전을 선택합니다. (예: 11 또는 17)

1.2 프로젝트 라이브러리 추가하기

Spring Boot 프로젝트에서 사용할 의존성을 선택합니다. Spring Initializr는 다양한 라이브러리를 제공하며, 애플리케이션에 필요한 기능을 미리 선택할 수 있습니다. 이번 실습 시간에는 아래 라이브러리들을 예시로 다운로드 받겠습니다. 

  • Spring Web: 웹 애플리케이션 개발을 위한 필수 모듈
  • Spring Data JPA: 데이터베이스 연동을 위한 JPA 모듈
  • H2 Database: 간단한 테스트 데이터베이스
  • Lombok: 코드 간소화를 위한 어노테이션 라이브러리

필요에 따라 추가적인 라이브러리를 선택할 수 있습니다. 

1.3 프로젝트 생성하기

모든 설정이 완료되면 "Generate" 버튼을 클릭하여 프로젝트를 다운로드합니다. 다운로드된 프로젝트는 .zip 파일로 제공되며, 이를 적절한 위치에 저장합니다.

2. IntelliJ에서 프로젝트 Import 하기

2.1 다운로드된 경로에 프로젝트 파일의 압축을 풀고, 경로와 디렉터리 구조를 /develop/workspace로 맞춰주세요.

다운로드한 .zip 파일의 압축을 해제하고, 원하는 작업 공간(예: /develop/workspace)에 파일을 배치합니다. 

2.2 인텔리제이 Projects 탭의 Open을 클릭해 주세요.

IntelliJ IDEA를 실행한 후, Projects 탭에서 Open을 클릭하여 다운로드된 프로젝트의 pom.xml(Maven 사용 시) 또는 build.gradle(Gradle 사용 시)을 선택합니다. IntelliJ가 자동으로 필요한 의존성을 다운로드하고 프로젝트를 설정합니다.



3. 인텔리제이(IntelliJ) 환경설정 및 플러그인 설치

3.1 환경설정(Settings)

IntelliJ에서 Ctrl + Alt + S (Windows), Command + , (Mac) 를 눌러 Settings 창을 엽니다. 여기에서 다음과 같은 설정을 확인하세요. 

  • Editor > Code Style: 코딩 스타일을 본인 또는 팀의 스타일에 맞게 조정합니다.

  • Build, Execution, Deployment > Build Tools: 프로젝트의 빌드 도구(Maven 또는 Gradle)를 설정합니다.

3.2 플러그인(Plugin)

플러그인은 개발 생산성을 높여주기 때문에 필수적입니다. Settings > Plugins로 이동하여 필요한 플러그인을 설치할 수 있습니다.

3.3 유용한 플러그인

  • Lombok: getter/setter 등 보일러플레이트 코드를 자동으로 생성해 주는 유용한 플러그인입니다. 프로젝트에 Lombok을 사용한다면 필수입니다.
  • Git ToolBox: Git History를 쉽게 사용할 수 있도록 도와주는 플러그인입니다. git에 이력이 있는 파일에서 원하는 라인을 클릭하면 옆에 마지막 수정자, 수정일시, 커밋내역이 표시되게 됩니다.

 

4. Spring Boot 내 환경설정 방법

4.1 포트번호 설정

Spring Boot에서 기본적으로 8080번 포트를 사용합니다. 포트 번호를 변경하려면 application.properties 또는 application.yml 파일을 수정합니다.

  • application.properties에서 포트 변경
server.port=9090
  • application.yml에서 포트 변경
server:
  port: 9090

 

4.2 application.yml 설정

application.yml은 Spring Boot에서 설정 파일로 사용됩니다. 이를 통해 데이터베이스 연결 정보, 로깅, 외부 API 연결 정보 등을 설정할 수 있습니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: myuser
    password: mypassword
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
logging:
  level:
    root: INFO

5. API 개발에 주로 사용되는 어노테이션 목록

5.1 @RestController

@RestController는 RESTful 웹 서비스를 만들기 위해 사용되는 어노테이션입니다. 기본적으로 @Controller와 @ResponseBody를 결합한 형태입니다. 즉, 별도의 @ResponseBody 어노테이션을 붙이지 않아도 메서드가 반환하는 데이터는 자동으로 JSON 형식으로 직렬화되어 클라이언트에 전달됩니다. 이는 주로 API 서버에서 데이터를 반환할 때 많이 사용됩니다.

@RestController
public class SampleController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

5.2 @Controller

@Controller는 주로 웹 애플리케이션의 View를 반환하기 위해 사용됩니다. 메서드의 반환값은 View 이름으로 처리되며, 템플릿 엔진(예: Thymeleaf, JSP)을 통해 HTML 페이지를 렌더링합니다. 데이터를 뷰에 전달하려면 Model 객체를 사용할 수 있습니다.

@Controller
public class ViewController {
    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("message", "Welcome to the homepage!");
        return "home";  // home.html 페이지로 이동
    }
}

5.3 @RequestMapping

@RequestMapping은 HTTP 요청 경로와 메서드를 매핑하는 역할을 합니다. 특정 URL과 요청 메서드(GET, POST, PUT, DELETE 등)를 처리하도록 매핑할 수 있습니다. @RequestMapping은 다양한 메서드와 경로를 설정할 수 있어 유연하게 동작합니다. 예를 들어, GET 메서드를 처리하려면 다음과 같이 사용할 수 있습니다.

@RequestMapping(method = RequestMethod.GET, path = "/")
public String getHome() {
    return "Home";
}
  • 이 코드는 @GetMapping("/")과 동일한 역할을 수행합니다. 즉, 더 구체적인 단축 어노테이션이 존재합니다.

5.4 @GetMapping

@GetMapping은 HTTP GET 요청을 처리하는 어노테이션입니다. 주로 리소스를 조회할 때 사용됩니다. 예를 들어, @GetMapping("/users")는 GET /users 요청을 처리하게 됩니다. 이는 데이터를 읽고 반환하는 경우에 자주 사용됩니다.

@GetMapping("/users")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}

5.5 @PostMapping

@PostMapping은 HTTP POST 요청을 처리합니다. 주로 새로운 리소스를 생성할 때 사용됩니다. 클라이언트에서 서버로 데이터를 전송하여 새 리소스를 생성하는 경우, 이 어노테이션이 사용됩니다.

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.createUser(user);
}

5.6 @DeleteMapping

@DeleteMapping은 HTTP DELETE 요청을 처리합니다. 주로 리소스를 삭제할 때 사용됩니다. 특정 리소스를 식별하여 삭제하는 경우 유용합니다.

@DeleteMapping("/users/{id}")
public String deleteUser(@PathVariable Long id) {
    userService.deleteUser(id);
    return "User deleted";
}

5.7 @PutMapping

@PutMapping은 HTTP PUT 요청을 처리합니다. 주로 리소스를 업데이트할 때 사용됩니다. 기존 리소스를 변경하거나 수정하는 작업에 사용됩니다.

@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
    return userService.updateUser(id, user);
}

5.8 @PathVariable

@PathVariable은 URL 경로에 포함된 변수를 메서드 파라미터로 전달받을 때 사용됩니다. 경로에서 변수 값을 추출하여 사용하고자 할 때 매우 유용합니다. 예를 들어, @GetMapping("/users/{id}")에서 {id}는 사용자가 제공한 동적인 값이며, 이를 메서드에서 사용하기 위해 @PathVariable을 붙입니다.

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userService.getUserById(id);
}

이처럼 @PathVariable을 사용하면 경로에서 값이 동적으로 전달될 수 있으며, 여러 변수를 사용할 수도 있습니다.

@GetMapping("/users/{userId}/orders/{orderId}")
public Order getOrder(@PathVariable Long userId, @PathVariable Long orderId) {
    return orderService.getOrder(userId, orderId);
}

 

6. 샘플 API 만들기

src/main/java 경로에 /domain 디렉토리와 파일들을 먼저 만들어줍니다. 

6.1 Entity와 Repository 만들기

package com.example.demo.domain.entity;

public class Member {
    private Long id;
    private String name;

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }


    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
}

간단하게 id와 name이란 필드를 갖는 Member 엔티티를 만들어줍니다.

package com.example.demo.domain.repository;

import com.example.demo.domain.entity.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member userProfile);
    Optional <Member> findById(Long id);
    List<Member> findAll();
    Member updateNameById(Long id, String name);
    Member deleteById(Long id);
}

그리고 Entity에 접근하기 위한 Repository 안에 CRUD에 해당하는 메서드들을 인터페이스 안에 지정해줍니다.
이제 해당 내용을 바탕으로 Repository를 직접 구현해보겠습니다. Database 연동 및 JPA 활용은 범위를 넘어가는 내용이니, 메모리에 데이터를 생성/수정/저장/삭제 하는 작업을 진행하도록 하겠습니다. 

package com.example.demo.domain.repository;

import com.example.demo.domain.entity.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public Member updateNameById(Long id, String name) {
        Member member = store.get(id);
        member.setName(name);
        return member;
    }

    public Member deleteById(Long id) {
        return store.remove(id);
    }

    public void clearStore() {
        store.clear();
    }
}

6.2 GET : 조회하기

Controller 영역을 만들어줍니다. 

  • @RequiredArgsConstructor
    • @RequiredArgsConstructor를 사용하여, final로 선언된 필드를 인자로 받는 생성자를 자동으로 만들어 줍니다. 즉, MemoryMemberRepository 필드에 대한 의존성을 생성자 주입 방식으로 처리합니다. 
  • @RequestMapping("/api")
    • 이 애너테이션은 이 컨트롤러 클래스의 기본 경로를 /api로 지정합니다. 따라서 이 클래스 내의 모든 메서드는 /api를 기본 경로로 갖습니다. 
package com.example.demo.controller;

import com.example.demo.domain.entity.Member;
import com.example.demo.domain.repository.MemoryMemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class MemberController {

    private final MemoryMemberRepository memoryMemberRepository;

}

 

  • 목록 조회

 

Spring Boot는 기본적으로 객체를 JSON 형태로 직렬화하여 HTTP 응답으로 반환합니다. 리스트 형태의 Member 객체를 반환합니다. 

 

@GetMapping("/users")
public List<Member> getMemberList(){
    return memoryMemberRepository.findAll();
}
  • 요소 조회
@Autowired
private final MemoryMemberRepository memoryMemberRepository;

@GetMapping("/users/{id}")
public Optional<UserProfile> getMember(Long id){
    return memoryMemberRepository.findById(id);
}

6.3 POST : 생성하기

POST 요청을 통해 새로운 유저를 생성하는 방법은 다음과 같습니다.

@PostMapping("/users")
public UserProfile createUserProfile(@RequestBody Member member){
    return memoryMemberRepository.save(userProfile);
}

6.4 PUT : 수정하기

PUT 요청을 통해 유저 정보를 수정하는 방법은 다음과 같습니다.

@PutMapping("/users/{id}")
public UserProfile updateUserName(@PathVariable("id") String id, @RequestBody Member member){
    return memoryMemberRepository.updateNameById(id, member.getName());
}

6.5 DELETE : 삭제하기

DELETE 요청을 통해 특정 유저를 삭제하는 방법은 다음과 같습니다.

@DeleteMapping("/users/{id}")
public UserProfile deleteUserProfile(@PathVariable("id") String id){
    return memoryMemberRepository.deleteById(id);
}

 

이상으로 긴 글 읽어주셔서 감사합니다. 

반응형

댓글