[프로젝트] 인스타그램(6) - 게시물 등록하기

2 분 소요

다른 페이지

https://sjj02055.github.io/projects/instagram_1/ https://sjj02055.github.io/projects/instagram_2/ https://sjj02055.github.io/projects/instagram_3/ https://sjj02055.github.io/projects/instagram_4/ https://sjj02055.github.io/projects/instagram_5/

실행 환경

Intellij, Oracle

사용 Tools

SpringBoot, Thymeleaf, Lombok, json-simple, JPA

인스타그램 - 게시물 등록하기

Post.java

package com.example.demo.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Comparator;

@Entity
@Getter @Setter
public class Post implements Comparator<Post> {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumn(name = "userId")
    private Member member;

    private String description;
    private String location;

    private Timestamp create_date;
    private Timestamp update_date;

    @Override
    public int compare(Post p1, Post p2){
        Long l1 = p1.getCreate_date().getTime();
        Long l2 = p2.getCreate_date().getTime();

        if(l1>l2)
            return -1;
        else
            return 1;
    }
}

Post_image

package com.example.demo.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Post_image {

    @Id
    @GeneratedValue
    Long id;

    Long postId;

    String filename;
    String fileorImage;

}

PostRepository.java

package com.example.demo.repository;

import com.example.demo.domain.Post;
import com.example.demo.domain.Post_image;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

@Repository
@Slf4j
@RequiredArgsConstructor
public class PostRepository {

    private final EntityManager em;

    public void save(Post post){
        em.persist(post);
    }

    public void delete(Post post){
        em.remove(post);
    }

    public void piSave(Post_image pi){
        em.persist(pi);
    }

    public void pidelete(Post_image pi){
        em.remove(pi);
    }

    public Post findOne(Long id){
        return em.find(Post.class, id);
    }

    public List<Post> findByUserIdOrderByIdDesc(long id){
        return em.createQuery("select p from Post p where p.member.id=:id ORDER BY p.id DESC " , Post.class)
                .setParameter("id",id)
                .getResultList();
    }

    public List<Post_image> findByPostId(){
        return em.createQuery("select p from Post_image p", Post_image.class)
                .getResultList();
    }

    public List<Post_image> findByPostImage_postId(Long id){
        return em.createQuery("select pi from Post_image pi WHERE pi.postId =: id", Post_image.class)
                .setParameter("id", id)
                .getResultList();
    }

}
package com.example.demo.service;

import com.example.demo.domain.Post;
import com.example.demo.domain.Post_image;
import com.example.demo.repository.PostInterfaceRepository;
import com.example.demo.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class PostService {

    private final PostRepository postRepository;
    private final PostInterfaceRepository postInterfaceRepository;

    @Transactional
    public Long save(Post p){
        postRepository.save(p);
        return p.getId();
    }

    @Transactional
    public Long piSave(Post_image p){
        postRepository.piSave(p);
        return p.getId();
    }

    @Transactional
    public void deletePost(Long id){
        Post p = postRepository.findOne(id);
        for(Post_image pi : postRepository.findByPostImage_postId(p.getId())){
            postRepository.pidelete(pi);
        }
        postRepository.delete(p);
    }

    public Post findOne(Long id){
        return postRepository.findOne(id);
    }

    public List<Post> findByUserIdOrderByIdDesc(long id){
        return postRepository.findByUserIdOrderByIdDesc(id);
    }

    public List<Post_image> findByPostid(){
        return postRepository.findByPostId();
    }

    public int countByMemberId(Long id){
        return postInterfaceRepository.countByMemberId(id);
    }

}

레포지토리와 서비스를 구성했으니 프론트쪽으로!

profile.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <div th:replace="fragments/header ::header"></div>
    <title>Instagram</title>
    <link rel="stylesheet" type="text/css" th:href="@{/css/uploadProfile.css}"/>
    <!-- favicon -->
    <link rel="icon" href="img/favicon.png">
    <link rel="instagram-icon" href="img/favicon.png">
</head>
<body>

<div class="info">
    <form action="/member/update/profile" method="post" th:object="${updateForm}">
        <div class="form-group">
            <label for="name">이름</label>
            <input type="text" class="form-control w200" id="name"
                   th:field="*{name}" placeholder="이름" th:value="${member.name}" />
        </div>
        <div class="form-group">
            <label for="nickname">닉네임</label>
            <input type="text" class="form-control w200" id="nickname"
                   th:field="*{nickname}" placeholder="닉네임" th:value="${member.nickname}" />
        </div>
        <div class="form-group">
            <label for="introduce">소개</label>
            <input type="text" class="form-control w200" id="introduce"
                   th:field="*{introduce}" placeholder="소개" th:value="${member.introduce}" />
        </div>
        <button type="submit" class="btn btn-default">완료</button>
    </form>
</div>
</body>
</html>

물론 여기에 프로필 사진까지 변경하는 코드도 있었지만 전에 해결했으니 나머지 정보 수정만 올리면 될것같다.

MemberController.java

    @GetMapping("update/profile")
    public String update(@SessionAttribute(name="loginMember", required = false) Member loginMember,
                         Model model){
        model.addAttribute("member", loginMember);
        model.addAttribute("loginMember", loginMember);
        model.addAttribute("updateForm", new updateForm());
        return "member/update/profile";
    }

    @PostMapping("update/profile")
    public String update(@Valid @ModelAttribute updateForm form, BindingResult result, HttpServletRequest request){
        if(result.hasErrors()){
            return "member/update/profile";
        }
        HttpSession session =request.getSession(false);
        Member loginMember = (Member)session.getAttribute("loginMember");

        loginMember.setName(form.getName());
        loginMember.setNickname(form.getNickname());
        loginMember.setIntroduce(form.getIntroduce());

        memberService.update(loginMember);
        Member tempMember = memberService.find(loginMember.getId());
        if(session!=null){
            session.invalidate();
        }
        session = request.getSession();
        session.setAttribute("loginMember",tempMember);
        return "redirect:/";
    }

    @ResponseBody
    @GetMapping("/images/profile/{userId}/{filename}")
    public Resource downloadImage(@PathVariable String filename, @PathVariable String userId) throws MalformedURLException {
        return new UrlResource("file:" +fileDir+"profile\\"+ userId +"\\"+filename);
    }

후기

자 홈에 게시물 올리는 것도 끝이고 다음은 팔로우 한사람 게시글도 올려야하니까 팔로우 팔로잉 기능도 추가해야겠다.

카테고리:

업데이트: