본문 바로가기
CODE/CodeKnowledge

파이어베이스와 스프링부트를 이용하여 웹사이트 만들기 ②

by 솔리닉__ 2023. 7. 9.
반응형

✔사족이 좀 많을 수 있는데 그건 회색글씨로 처리하겠습니다 빼고 읽으세요 😊

 

일단 이렇게 구성되어 있습니다

지난번 SDK를 이용해서 초기화를 이렇게 해주시면 됩니다. 

@Service
public class FirebaseInitialization {

    @PostConstruct
    public void initializtion() throws FileNotFoundException {


        FileInputStream serviceAccount = new FileInputStream("./serviceAccountKey.json");

        try {
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .build();

            FirebaseApp.initializeApp(options);
            Map<String, Object> additionalClaims = new HashMap<String, Object>();
            additionalClaims.put("check", true);
            String customToken = FirebaseAuth.getInstance().createCustomTokenAsync(UID, additionalClaims).get();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

 

① user VO를 만들면 됩니다.

public class User {

    private String gender;
    private String age;

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

②파이어스토어에 컬렉션을 생성해주시면 됩니다. 

생성하면 이렇습니다 기본값으로 지정한 건 제가 지웠습니다.&nbsp;

 

③서비스를 만들어서 데이터에 어떻게 값을 넣을지를 정합니다. 

saveUser는 정보를 저장하는 메소드입니다. 컬렉션은 user로 고정값입니다. 들어갈 컬렉션을 지정해주시면 됩니다. 

도큐멘트(문서)는 키값을 지정해야 합니다. 중복되면 안 됩니다. 그렇기 때문에 파이어베이스에서 제공하는, 회원정보의 uid를 받아서 쓰는 편입니다. 지금은 간단하게 데이터 입력과 출력을 보여드리는 과정이기 때문에 고정값을 age로 쓰도록 하겠습니다. 

@Service
public class UserService {
    

    public String saveUser(User user, String age){

        Firestore firestore = FirestoreClient.getFirestore();
        ApiFuture<WriteResult> apiFuture = firestore.collection("user").document(age).set(user);

        String result = null;
        try {
            result = apiFuture.get().getUpdateTime().toString();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return result;
    }


    public User getUserInfo(String uid) {

        Firestore firestore = FirestoreClient.getFirestore();
        DocumentReference documentReference = firestore.collection("user").document("age");

        ApiFuture<DocumentSnapshot> future = documentReference.get();
        DocumentSnapshot document = null;
        try {
            document = future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        User user = null;
        if (document.exists()) {
            user = document.toObject(User.class);
            return user;
        } else {
            return null;
        }
    }

 

④ <list.html> 타임리프를 이용하여 view페이지의 값을 넣어보도록 하겠습니다. 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://thymeleaf.org">
<!--<html xmlns:th="http://www.thymeleaf.org" lang="ko">-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
    <meta charset="UTF-8">
    <title>호호</title>
</head>
<body>
<form action="#" th:action="@{/uesrExtraInfo}" th:object="${user}" method="post">
    <p>성별: <input type="text" th:field="*{gender}"/></p>
    <p>나이: <input type="text" th:field="*{age}"/></p>
    <p><input type="submit" value="Submit"/> <input type="reset" value="Reset"/>
    </p>
</form>
</body>
</html>

출력화면입니다.&nbsp;

th:object="${user}" 에 성별과 나이의 데이터값을 담아서 /userExtraInfo로 보냅니다.

 

⑤ controller를 이용하여 이제 데이터 객체를 담고 뷰페이지를 반환해줍니다. 

    @GetMapping("/list")
    public String list(Model model){

        model.addAttribute("user", new User());

        return "list";
    }

    @PostMapping("/uesrExtraInfo")
    public String userExtraInfo(HttpServletRequest request, @ModelAttribute("user") User user, Model model){


        String age = request.getParameter("age");
        String gender = request.getParameter("gender");

        user.setAge(age);
        user.setGender(gender);
        model.addAttribute("user",user);
        System.out.println("userExtraInfo : " + age + " " +gender);

        userService.saveUser(user, age);

        return "index";

    }

list로 주소를 맵핑합니다. localhost:8080/list로 들어가면 아래의 화면이 뜹니다. 모델 객체를 생성해 데이터의 값이 들어갈 일종의 그릇을 만들어주어야 합니다. 이걸 생성하지 않으면 오류가 발생합니다. 꼭 알아두세요! 

 

submit을 누르면 /userExtraInfo로 도착하게 됩니다. 

데이터값이 무사히 잘 들어갔습니다.

이렇게 하면 이제 데이터 값을 넣는 걸 확인할 수 있습니다. 주로 포스트맨을 써서 데이터를 전송하는 건 그나마 조금은 찾을 수 있는데 이렇게 view페이지에서 하는 건 자료가 없어서.. 전 많이 힘들었습니다... 

 

이미 서비스에서 유저정보를 불러오는 메소드는 만들어 놓았기 때문에 다음에는 들어간 데이터를 불러오는 걸 해보겠습니다. 

반응형

댓글