Skip to content

Commit

Permalink
Merge pull request #14 from kakao-tech-campus-2nd-step3/develop
Browse files Browse the repository at this point in the history
[1주차 Develop -> Master]
  • Loading branch information
sanghee0820 authored Sep 20, 2024
2 parents 2025653 + 8bd1d65 commit 504bf00
Show file tree
Hide file tree
Showing 21 changed files with 541 additions and 0 deletions.
77 changes: 77 additions & 0 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Java CI with Gradle

# Master, develop 브랜치에 push 혹은 pull request가 발생할 경우 동작한다.
on:
push:
branches: [ "Master", "develop" ]
pull_request:
branches: [ "Master", "develop" ]

permissions:
contents: read

jobs:
# Spring Boot 애플리케이션을 빌드하여 도커허브에 푸시하는 과정
build-docker-image:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
# 1. Java 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew

# 2. Spring Boot 애플리케이션 빌드
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: clean bootJar

# 3. Docker 이미지 빌드
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/inplace .

# 4. DockerHub 로그인
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

# 5. Docker Hub 이미지 푸시
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/inplace


# 위 과정에서 푸시한 이미지를 ec2에서 풀받아서 실행시키는 과정
run-docker-image-on-ec2:
# build-docker-image 과정이 완료되어야 실행된다.
needs: build-docker-image
runs-on: self-hosted

steps:
# 1. 최신 이미지를 pull
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/inplace

# 2. 기존의 컨테이너를 중지
- name: docker stop container
run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true

# 3. 브랜치에 따라 다른 환경 변수를 설정하여 컨테이너 실행
- name: docker run new container
run: |
if [ "${{ github.ref }}" == "refs/heads/master" ]; then
sudo docker run --name inplace --rm -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/inplace
elif [ "${{ github.ref }}" == "refs/heads/develop" ]; then
sudo docker run --name inplace-dev --rm -d -p 8081:8080 ${{ secrets.DOCKERHUB_USERNAME }}/inplace
# 4. 미사용 이미지를 정리
- name: delete old docker image
run: sudo docker system prune -f
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@
## Project Version
- Spring Boots 3.3.3
- Java 17 LTS

---
## 리뷰 요청
### PlaceControllerTest
- Mock을 사용하여 테스트를 진행했는데, 적절히 사용했는지 잘 모르겠습니다.
- PlaceService를 mock, PlaceController를 InjectedMocks로 지정했는데 블로그 찾아보니 사람마다 조금씩 달라 적절한지 궁금합니다.
27 changes: 27 additions & 0 deletions src/main/java/team7/inplace/place/controller/PlaceController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package team7.inplace.place.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import team7.inplace.place.domain.CategoryListDTO;
import team7.inplace.place.service.PlaceService;

@RestController
@RequestMapping("/places")
public class PlaceController {
private final PlaceService placeService;

@Autowired
public PlaceController(PlaceService placeService) {
this.placeService = placeService;
}
@GetMapping("/categories")
public ResponseEntity<CategoryListDTO> getCategories() {
CategoryListDTO response = placeService.getCategories();

return new ResponseEntity<>(response, HttpStatus.OK);
}
}
8 changes: 8 additions & 0 deletions src/main/java/team7/inplace/place/domain/Category.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package team7.inplace.place.domain;

public enum Category {
CAFE,
WESTERN,
JAPANESE,
KOREAN
}
7 changes: 7 additions & 0 deletions src/main/java/team7/inplace/place/domain/CategoryListDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team7.inplace.place.domain;

import java.util.List;

public record CategoryListDTO(List<Category> categories) {

}
79 changes: 79 additions & 0 deletions src/main/java/team7/inplace/place/domain/Place.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package team7.inplace.place.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;

@Entity
@Table(name = "places")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Place {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long placeId;

@Column(nullable = false, length = 50)
private String name;

@ColumnDefault("false")
@Column(nullable = false)
private boolean pet;

@ColumnDefault("false")
@Column(nullable = false)
private boolean wifi;

@ColumnDefault("false")
@Column(nullable = false)
private boolean parking;

@ColumnDefault("false")
@Column(nullable = false)
private boolean fordisabled;

@ColumnDefault("false")
@Column(nullable = false)
private boolean nursery;

@ColumnDefault("false")
@Column(nullable = false)
private boolean smokingroom;

@Column(nullable = false, length = 50)
private String address1;

@Column(nullable = false, length = 50)
private String address2;

@Column(nullable = false, length = 50)
private String address3;

@Column(columnDefinition = "TEXT")
private String menuImgUrl;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Category category;

@Column(nullable = false, columnDefinition = "TEXT")
private String longitude;

@Column(nullable = false, columnDefinition = "TEXT")
private String latitude;

}
10 changes: 10 additions & 0 deletions src/main/java/team7/inplace/place/repository/PlaceRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package team7.inplace.place.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import team7.inplace.place.domain.Place;

@Repository
public interface PlaceRepository extends JpaRepository<Place, Long> {

}
9 changes: 9 additions & 0 deletions src/main/java/team7/inplace/place/service/PlaceService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package team7.inplace.place.service;

import java.util.List;
import org.springframework.stereotype.Service;
import team7.inplace.place.domain.CategoryListDTO;

public interface PlaceService {
CategoryListDTO getCategories();
}
18 changes: 18 additions & 0 deletions src/main/java/team7/inplace/place/service/PlaceServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package team7.inplace.place.service;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import team7.inplace.place.domain.Category;
import team7.inplace.place.domain.CategoryListDTO;

@Service
public class PlaceServiceImpl implements PlaceService{

@Override
public CategoryListDTO getCategories() {
List<Category> categories = Arrays.stream(Category.values()).toList();
return new CategoryListDTO(categories);
}
}
4 changes: 4 additions & 0 deletions src/main/java/team7/inplace/video/DTO/PlaceForVideo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package team7.inplace.video.DTO;

public record PlaceForVideo(Long placeId, String placeName) {
}
4 changes: 4 additions & 0 deletions src/main/java/team7/inplace/video/DTO/VideoData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package team7.inplace.video.DTO;

public record VideoData(Long videoId, String videoAlias, String videoUrl, PlaceForVideo place) {
}
7 changes: 7 additions & 0 deletions src/main/java/team7/inplace/video/DTO/VideoResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team7.inplace.video.DTO;

public record VideoResponse(Long videoId, String videoAlias, String videoUrl, PlaceForVideo place) {
public VideoResponse(VideoData videoData) {
this(videoData.videoId(), videoData.videoAlias(), videoData.videoUrl(), videoData.place());
}
}
32 changes: 32 additions & 0 deletions src/main/java/team7/inplace/video/controller/VideoController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package team7.inplace.video.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import team7.inplace.video.DTO.VideoData;
import team7.inplace.video.DTO.VideoResponse;
import team7.inplace.video.service.VideoService;

import java.util.List;
import java.util.stream.Collectors;

@RestController
public class VideoController {
private final VideoService videoService;

public VideoController(VideoService videoService) {
this.videoService = videoService;
}

// 내 인플루언서가 방문한 그 곳
@GetMapping("video")
public ResponseEntity<List<VideoResponse>> readByInfluencer(
@RequestParam(name="influencer", required = false) List<String> influencers
){
List<VideoData> videoDatas = videoService.findByInfluencer(influencers);
List<VideoResponse> videoInfo = videoDatas.stream().map(VideoResponse::new).toList();
return new ResponseEntity<>(videoInfo, HttpStatus.OK);
}
}
26 changes: 26 additions & 0 deletions src/main/java/team7/inplace/video/entity/Influencer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package team7.inplace.video.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;

@Entity
@Getter
public class Influencer {
/*
* 더미 데이터 입니다 !!!
*/
@Id
private Long id;
@Column
private String name;
@Column
private String job;
@Column
private String imgUrl;

protected Influencer() {

}
}
22 changes: 22 additions & 0 deletions src/main/java/team7/inplace/video/entity/Place.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package team7.inplace.video.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;

@Entity
@Getter
public class Place {
/*
* 더미 데이터 입니다 !!!
*/
@Id
private Long id;
@Column
private String name;

protected Place(){

}
}
22 changes: 22 additions & 0 deletions src/main/java/team7/inplace/video/entity/Video.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package team7.inplace.video.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
public class Video {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="video_url")
private String videoUrl;
@ManyToOne
@JoinColumn(name = "influencer_id")
private Influencer influencer;
@ManyToOne
@JoinColumn(name = "place_id")
private Place place;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package team7.inplace.video.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import team7.inplace.video.entity.Influencer;

import java.util.List;

public interface InfluencerRepository extends JpaRepository<Influencer, Long> {
// 더미 데이터 입니다!!

@Override
List<Influencer> findAllById(Iterable<Long> longs);

List<Influencer> findByNameIn(List<String> names);
}
Loading

0 comments on commit 504bf00

Please sign in to comment.