[Spring boot/Firebase] Spring boot와 Firebase 연결
spring boot에 firebase를 연결하는 경우가 많이 없어서 정보를 찾는데 많은 고생을 했었다.
firebase를 사용하면 front와 back을 나누어서 프로젝트를 진행하는 것보다는 front에서 직접적으로 데이터를 호출해서 사용하는 것이 편하지만... 그냥 경험을 위해 사용해 봤다.
참고
[Spring Boot] Firebase 연동 방법
https://firework-ham.tistory.com/111
프로젝트 생성

gradle과 자바 17 버전을 사용했다.
의존성 추가
프로젝트 생성 후 build.gradle 파일 dependencies 안에
웹과 웹 서비스를 구현하기 위한 의존성을 추가해 준다.
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
Firebase 의존성 추가
Firebase 문서 참고
https://firebase.google.com/docs/firestore/quickstart?hl=ko&authuser=0&_gl=1*qei04s*_up*MQ..*_ga*MTUxNzQ0NjUwOS4xNzE0NzEwMDk5*_ga_CW55HF8NVT*MTcxNDcxODUzOS4zLjEuMTcxNDcxODYwNS41NC4wLjA.
implementation group: 'com.google.firebase', name: 'firebase-admin', version: '9.2.0'
Firebase 연결

프로젝트 설정 > 서비스 계정

새 비공개 키 생성 > 다운로드한 파일을 resources 폴더 밑에 저장한다.

FirebaseConfig.java 생성
비공개 키 생성하는 곳에 있던 Admin SDK 구성 스니펫에서 java버전 선택 후 코드 전체를 복사해서 붙여 넣는다.
@Configuration
public class FirebaseConfig {
@PostConstruct
public void firestore() throws IOException {
InputStream serviceAccount = getClass().getResourceAsStream("/serviceAccountKey.json");
//다운받은 비공개 키 이름
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.setDatabaseUrl("https://project-test-383014-default-rtdb.firebaseio.com")
.build();
FirebaseApp.initializeApp(options);
}
}
이러면 연결 끝.
확인을 위해 DB에 아무런 데이터를 넣어두고 불러오는 컨트롤러를 만들어서 테스트를 해봤다.
DB 데이터

Test.java
@NoArgsConstructor
@Getter
@Setter
public class Test {
private String id;
private String pw;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date birth;
}
TestService.java
@Service
public class TestService {
public List<Test> getUsers() throws Exception{
List<Test> list = new ArrayList<>();
Firestore firestore = FirestoreClient.getFirestore();
//컬렉션참조
CollectionReference collectionRef = firestore.collection("User");
List<QueryDocumentSnapshot> documents = collectionRef.get().get().getDocuments();
for (QueryDocumentSnapshot document : documents) {
list.add(document.toObject(Test.class));
}
return list;
}
}
TestController.java
@RestController
@RequiredArgsConstructor
@RequestMapping("test")
public class TestController {
Test test;
private final TestService testService;
@GetMapping("/get")
public ResponseEntity<List<Test>> getUser() throws Exception{
List<Test> list = testService.getUsers();
return ResponseEntity.ok(list);
}
}
프로젝트 실행 후 매핑해 준 경로 localhost:8080/test/get 접속 시

데이터가 잘 가져와진다.
연결이 잘되었다.