[프로젝트] 인스타그램(6) - 게시물 등록하기
다른 페이지
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);
}
후기
자 홈에 게시물 올리는 것도 끝이고 다음은 팔로우 한사람 게시글도 올려야하니까 팔로우 팔로잉 기능도 추가해야겠다.