๐Ÿ”ง ๋ฐฑ์—”๋“œ ๐ŸŒฑ ์ž…๋ฌธ

Spring Boot ์ž…๋ฌธ

Java Spring Boot๋กœ REST API ๊ฐœ๋ฐœ

โฑ๏ธ 10์‹œ๊ฐ„ ๐Ÿ‘๏ธ 23 ์กฐํšŒ
๐Ÿ“– ๊ฐ•์ขŒ ๋‚ด์šฉ
# Spring Boot ์ž…๋ฌธ ๊ฐ€์ด๋“œ

## ํ•™์Šต ๋ชฉํ‘œ
Spring Boot๋กœ Java ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

## 1. Spring Boot๋ž€?
Java ๊ธฐ๋ฐ˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
- ์„ค์ • ์ž๋™ํ™”
- ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„
- ์˜์กด์„ฑ ๊ด€๋ฆฌ ๊ฐ„์†Œํ™”
- ํ”„๋กœ๋•์…˜ ๋ ˆ๋””

## 2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
Spring Initializr:
https://start.spring.io
- Project: Maven ๋˜๋Š” Gradle
- Language: Java
- Dependencies: Spring Web, Spring Data JPA, MySQL Driver

IDE์—์„œ ์ƒ์„ฑ:
IntelliJ: New Project > Spring Initializr
VS Code: Spring Boot Extension

## 3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
src/main/java/
com/example/demo/
DemoApplication.java
controller/
service/
repository/
model/
src/main/resources/
application.properties
static/
templates/
pom.xml (Maven) / build.gradle (Gradle)

## 4. ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

## 5. REST Controller
@RestController
@RequestMapping("/api")
public class UserController {

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

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

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

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

@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
userService.delete(id);
}
}

## 6. Entity
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Column(unique = true)
private String email;

@CreationTimestamp
private LocalDateTime createdAt;

// Getters and Setters
}

## 7. Repository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String keyword);

@Query("SELECT u FROM User u WHERE u.createdAt > :date")
List<User> findRecentUsers(@Param("date") LocalDateTime date);
}

## 8. Service
@Service
public class UserService {

@Autowired
private UserRepository userRepository;

public List<User> findAll() {
return userRepository.findAll();
}

public User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found"));
}

public User save(User user) {
return userRepository.save(user);
}

@Transactional
public User update(Long id, User userData) {
User user = findById(id);
user.setName(userData.getName());
user.setEmail(userData.getEmail());
return userRepository.save(user);
}

public void delete(Long id) {
userRepository.deleteById(id);
}
}

## 9. application.properties
์„œ๋ฒ„ ์„ค์ •:
server.port=8080

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

JPA:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

## 10. ์˜์กด์„ฑ ์ฃผ์ž…
์ƒ์„ฑ์ž ์ฃผ์ž… (๊ถŒ์žฅ):
@Service
public class UserService {
private final UserRepository userRepository;

public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}

Lombok ์‚ฌ์šฉ:
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}

## 11. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(RuntimeException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());
}

@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Server error");
}
}

## 12. ์‹คํ–‰ ๋ฐ ๋นŒ๋“œ
์‹คํ–‰:
./mvnw spring-boot:run
./gradlew bootRun

๋นŒ๋“œ:
./mvnw clean package
./gradlew build

JAR ์‹คํ–‰:
java -jar target/demo-0.0.1-SNAPSHOT.jar
java -jar -Dspring.profiles.active=prod app.jar

## ์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ
1. ๊ธฐ๋ณธ REST API ์ž‘์„ฑ
2. JPA Entity์™€ Repository
3. Service ๊ณ„์ธต ๊ตฌํ˜„
4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
5. ๋ณด์•ˆ ๋ฐ ๋ฐฐํฌ