Coding History/Team Project

팀플) 관측 장소(ObservationLocation), 천문 이벤트(AstronomicalEvent) API 구현

BlackBirdIT 2024. 10. 6. 21:26

1. 관측 장소(ObservationLocation) API 구현

  • 엔드포인트 구조:
    • GET /locations: 모든 관측 장소 리스트 가져오기
    • POST /locations: 새로운 관측 장소 추가하기
    • PUT /locations/{id}: 특정 관측 장소 업데이트
    • DELETE /locations/{id}: 특정 관측 장소 삭제하기

해야 할 작업:

  • 컨트롤러 작성: ObservationLocationController에서 위의 엔드포인트들을 구현해야 함.
  • 서비스 작성: ObservationLocationService를 만들어서 비즈니스 로직을 처리하고, 장소 데이터를 가져오거나 추가하는 로직을 구현.
  • 리포지토리 작성: ObservationLocationRepository를 사용해서 데이터베이스에서 직접적으로 관측 장소 데이터를 처리하도록 구현.

2. 천문 이벤트(AstronomicalEvent) API 구현

  • 엔드포인트 구조:
    • GET /events: 모든 천문 이벤트 리스트 가져오기
    • POST /events: 새로운 천문 이벤트 추가하기
    • PUT /events/{id}: 특정 천문 이벤트 업데이트
    • DELETE /events/{id}: 특정 천문 이벤트 삭제하기

해야 할 작업:

  • 컨트롤러 작성: AstronomicalEventController에서 위의 엔드포인트들을 구현해야 함.
  • 서비스 작성: AstronomicalEventService를 만들어서 이벤트 데이터를 관리하는 로직을 처리.
  • 리포지토리 작성: AstronomicalEventRepository를 사용해 데이터베이스와 상호작용하도록 구현.

라는 계획을 짜고 이제 구현 시작.

엔티티부터 생성해주었다.

-완료

이제 컨트롤러 생성하자.

ObservationLocationControllerAstronomicalEventController가 필요한데, 일단은 ObservationLocationController부터 시작해서 서비스와 리포지토리까지.

@RestController
@RequestMapping("/locations")
public class ObservationLocationController {
    @Autowired
    private ObservationLocationService locationService;

    // 모든 관측 장소 리스트 가져오기
    @GetMapping
    public List<ObservationLocation> getAllLocations() {
        return locationService.getAllLocations();
    }

    // 새로운 관측 장소 추가
    @PostMapping
    public ObservationLocation addLocation(@RequestBody ObservationLocation location) {
        return locationService.addLocation(location);
    }

    // 특정 관측 장소 업데이트
    @PutMapping("/{id}")
    public ObservationLocation updateLocation(@PathVariable int id, @RequestBody ObservationLocation location) {
        return locationService.updateLocation(id, location);
    }

    // 특정 관측 장소 삭제
    @DeleteMapping("/{id}")
    public void deleteLocation(@PathVariable int id) {
        locationService.deleteLocation(id);
    }
}

이렇게 CRUD 구현했고, service로도 전달해주면 된다.

@Service
public class ObservationLocationService {
    @Autowired
    private ObservationLocationRepository locationRepository;

    // 모든 관측 장소 리스트 가져오기
    public List<ObservationLocation> getAllLocations() {
        return locationRepository.findAll();
    }

    // 새로운 관측 장소 추가
    public ObservationLocation addLocation(ObservationLocation location) {
        return locationRepository.save(location);
    }

    // 특정 관측 장소 업데이트
    public ObservationLocation updateLocation(int id, ObservationLocation updatedLocation) {
        Optional<ObservationLocation> existingLocation = locationRepository.findById(id);

        if (existingLocation.isPresent()) {
            ObservationLocation location = existingLocation.get();
            location.setLocName(updatedLocation.getLocName());
            location.setLatitude(updatedLocation.getLatitude());
            location.setLongitude(updatedLocation.getLongitude());
            location.setIsRecommended(updatedLocation.getIsRecommended());
            return locationRepository.save(location);
        } else {
            throw new RuntimeException("관측 장소를 찾을 수 없습니다.");
        }
    }

    // 특정 관측 장소 삭제
    public void deleteLocation(int id) {
        if (locationRepository.existsById(id)) {
            locationRepository.deleteById(id);
        } else {
            throw new RuntimeException("관측 장소를 찾을 수 없습니다.");
        }
    }
}

서비스는 이렇게.

리포지토리는 기본으로 제공하는 것들을 사용하기 때문에

@Repository
public interface ObservationLocationRepository extends JpaRepository<ObservationLocation, Integer> {
}

일단은 이렇게 선언만 해주었다.

AstronomicalEventController도 양상은 비슷하게 흐르니까 코드는 생략하겠다!


Test

이제 구현은 해 놨으니까 postman으로 테스트를 해보자.

테스트를 위해서 서버를 켜 봤고, 서버 정상 작동 확인.

이제 postman으로

  • GET 요청으로 관측 장소/천문 이벤트 목록이 잘 반환되는지.
  • POST 요청으로 새로운 관측 장소/천문 이벤트가 잘 등록되는지.
  • PUT 요청으로 관측 장소/천문 이벤트가 수정되는지.
  • DELETE 요청으로 관측 장소/천문 이벤트가 잘 삭제되는지.

를 테스트 하면 된당

일단 이렇게 만들었고 포스트부터 테스트 해보자.

{
    "locName": "한라산",
    "latitude": 33.3617,
    "longitude": 126.5292,
    "isRecommended": true
}

이렇게 포스트요청을 보내보자.

작성했고 Send해보면,,

실패! 한번에 되는 법이 없다.

Json형식으로 보내야하는데 쿼리 파라미터 방식으로 요청해서 그렇다는 판단이 서서 Json형식으로 바꿔서 보내보자.

Json 요청하는 곳 찾았고 이제 다시 포스트 해보자.

200 OK가 뜬 것을 보니까 제대로 된 것 같다.
근데 좀 찝찝한게 로그인 페이지를 결과로 가져왔다는 것이다. 예상이긴 하지만 아마 security에서 인증되지 않은 접근이라 막았을 가능성이 클 것 같아서 시큐리티 설정을 다시 만져줘야하지 않을까 예상한다.

의심되는 부분을 요청 접근 허용 상태로 만들었고, 다시 해보자.

Postman에서 결과다!

여긴 프로젝트 콘솔 로그다.

이제 DB 까보면..

DB에도 정상적으로 들어와있다.

굳.

이제 GET 확인해보자.

GET도 성공이다.

PUT확인.

Postman 결과 화면상으론 성공이니까 로그도 확인해보자.

로그 확인해보면 정상작동 했고, DB도 까보면.

DB상의 데이터도 변경되어있다.

이제는 DELETE 요청이다.

DELETE 요청시 200 OK 확인 했고,

로그도 잘 뜨고,

데이터도 잘 지워졌다.

CRUD 확인 끝,

AstronomicalEvent도 제대로 작동하는지 똑같은 방식으로 확인하면 된다.

  • POST

  • GET

  • PUT

  • DELETE

오케이 DB 까지 싹 확인했고 정상 출력 밑 DB 접근 다 확인했다.

이제 백엔드 설계를 했으니까 천문 API를 끌어와서 가공해서 여기맞춰 데이터를 다룰 수 있게 하면 될듯.

그러니까 다음 목표는 API 적용이다.