
Artifact와 Name을 point-service라고 지어주자. Package name을 Java 컨벤션에 맞게 pointservice라고 지어주자.Spring Boot DevTools, Spring Web, MySQL Driver, Spring Data JPA를 선택하자. 이 프로젝트에서는application.properties를 지우고application.yml을 생성했다.
server: port: 8082 spring: datasource: url: jdbc:mysql://localhost:3308/point-db # DB 주소 username: root # DB 계정 password: password # DB 비밀번호 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true

@Entity @Table(name = "points") public class Point { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long pointId; private Long userId; private int amount; public Point() { } public Point(Long userId, int amount) { this.userId = userId; this.amount = amount; } public Long getPointId() { return pointId; } public Long getUserId() { return userId; } public int getAmount() { return amount; } // 포인트 적립 (나중에 Service 로직 짤 때 사용) public void addAmount(int amount) { this.amount += amount; } // 포인트 차감 (나중에 Service 로직 짤 때 사용) public void deductAmount(int amount) { this.amount -= amount; } }
public interface PointRepository extends JpaRepository<Point, Long> { // 나중에 Service 로직 짤 때 사용 Optional<Point> findByUserId(Long userId); }
@RestController @RequestMapping("/points") public class PointController { private final PointService pointService; public PointController(PointService pointService) { this.pointService = pointService; } @PostMapping("add") public ResponseEntity<Void> addPoints( @RequestBody AddPointRequestDto addPointRequestDto ) { pointService.addPoints(addPointRequestDto); return ResponseEntity.noContent().build(); } @PostMapping("deduct") // deduct : 빼다 public ResponseEntity<Void> deductPoints( @RequestBody DeductPointRequestDto deductPointRequestDto ) { pointService.deductPoints(deductPointRequestDto); return ResponseEntity.noContent().build(); } }
public class AddPointRequestDto { private Long userId; private int amount; public Long getUserId() { return userId; } public int getAmount() { return amount; } }
public class DeductPointRequestDto { private Long userId; private int amount; public Long getUserId() { return userId; } public int getAmount() { return amount; } }
@Service public class PointService { private final PointRepository pointRepository; public PointService(PointRepository pointRepository) { this.pointRepository = pointRepository; } @Trasnsactional public void addPoints(AddPointRequestDto addPointRequestDto) { Point point = pointRepository.findByUserId(addPointRequestDto.getUserId()) .orElseGet(() -> new Point(addPointRequestDto.getUserId(), 0)); point.addAmount(addPointRequestDto.getAmount()); pointRepository.save(point); } @Transactional public void deductPoints(DeductPointRequestDto deductPointRequestDto) { Point point = pointRepository.findByUserId(deductPointRequestDto.getUserId()) .orElseThrow(() -> new IllegalArgumentException("사용자의 포인트 정보를 찾을 수 없습니다.")); point.deductAmount(deductPointRequestDto.getAmount()); pointRepository.save(point); } }




