diff --git a/.idea/Ticketing.iml b/.idea/Ticketing.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/Ticketing.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..a49272c
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..797acea
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..4b8631d
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1653958362269
+
+
+ 1653958362269
+
+
+
+
\ No newline at end of file
diff --git a/server/build.gradle.kts b/server/build.gradle.kts
index 04abc61..6cee94b 100644
--- a/server/build.gradle.kts
+++ b/server/build.gradle.kts
@@ -31,8 +31,11 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-actuator")
- implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4")
implementation("org.springframework.boot:spring-boot-starter-log4j2")
+ implementation("org.projectlombok:lombok:1.18.20")
+ implementation("io.springfox:springfox-swagger2:3.0.0")
+ implementation("io.springfox:springfox-swagger-ui:3.0.0")
+ implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4")
implementation("com.lmax:disruptor:3.4.2")
implementation("io.jsonwebtoken:jjwt-api:0.11.2")
@@ -42,6 +45,10 @@ dependencies {
}
}
+ testImplementation("org.springframework.boot:spring-boot-starter-test")
+ testImplementation("org.springframework.security:spring-security-test")
+ testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
+
compileOnly("org.projectlombok:lombok")
runtimeOnly("mysql:mysql-connector-java")
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.2")
@@ -49,6 +56,7 @@ dependencies {
annotationProcessor("org.projectlombok:lombok")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
+ testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
}
diff --git a/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java b/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java
new file mode 100644
index 0000000..c451b62
--- /dev/null
+++ b/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java
@@ -0,0 +1,69 @@
+package com.ticketing.server.global.config;
+
+import java.util.Arrays;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger.web.UiConfiguration;
+import springfox.documentation.swagger.web.UiConfigurationBuilder;
+
+@Configuration
+@RequiredArgsConstructor
+public class SwaggerConfig {
+
+ public static final String SECURITY_SCHEMA_NAME = "Authorization";
+ public static final String AUTHORIZATION_SCOPE_GLOBAL = "global";
+ public static final String AUTHORIZATION_SCOPE_GLOBAL_DESC = "accessEverything";
+
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.OAS_30)
+ .useDefaultResponseMessages(false)
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.ant("/api/**")).build()
+ .apiInfo(apiInfo())
+ .securityContexts(Arrays.asList(securityContext()))
+ .securitySchemes(Arrays.asList(apiKey()));
+ }
+
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("Ticketing REST API Document")
+ .version("v1")
+ .description("Ticketing REST API 문서").build();
+ }
+
+ private ApiKey apiKey() {
+ return new ApiKey(SECURITY_SCHEMA_NAME, "Authorization", "header");
+ }
+
+ private SecurityContext securityContext() {
+ return SecurityContext.builder().securityReferences(defaultAuth()).build();
+ }
+
+ private List defaultAuth() {
+ AuthorizationScope authorizationScope = new AuthorizationScope(AUTHORIZATION_SCOPE_GLOBAL,
+ AUTHORIZATION_SCOPE_GLOBAL_DESC);
+ AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+ authorizationScopes[0] = authorizationScope;
+ return Arrays.asList(new SecurityReference(SECURITY_SCHEMA_NAME, authorizationScopes));
+ }
+
+ @Bean
+ UiConfiguration uiConfig() {
+ return UiConfigurationBuilder.builder()
+ .build();
+ }
+}
diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java
index 0529484..4c6e377 100644
--- a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java
+++ b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java
@@ -1,18 +1,24 @@
package com.ticketing.server.movie.domain;
import com.ticketing.server.global.dto.repository.AbstractEntity;
+import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
@Entity
@Getter
+@NoArgsConstructor
+@AllArgsConstructor
public class Movie extends AbstractEntity {
- @NotNull
- private String title;
+ @NotNull
+ @Column(unique = true)
+ private String title;
- @NotNull
- private Integer runningTime;
+ @NotNull
+ private Integer runningTime;
}
diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java
index a29dbb9..9f8a736 100644
--- a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java
+++ b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java
@@ -3,10 +3,14 @@ package com.ticketing.server.movie.domain;
import com.ticketing.server.global.dto.repository.AbstractEntity;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
@Entity
@Getter
+@NoArgsConstructor
+@AllArgsConstructor
public class Theater extends AbstractEntity {
@NotNull
diff --git a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java
index e02118b..57996c8 100644
--- a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java
+++ b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java
@@ -6,10 +6,10 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum TicketStatus {
- SALE("판매가능"),
- SCHEDULED("환불"),
- SOLD("판매완료");
+ SALE("판매가능"),
+ SCHEDULED("환불"),
+ SOLD("판매완료");
- private String name;
+ private String name;
}
diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java
index d2021e0..630bd4f 100644
--- a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java
+++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java
@@ -1,10 +1,13 @@
package com.ticketing.server.movie.domain.repository;
import com.ticketing.server.movie.domain.Movie;
+import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MovieRepository extends JpaRepository {
+ Optional findByTitle(String title);
+
}
diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java
index 2b0b6b4..3610de3 100644
--- a/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java
+++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java
@@ -1,10 +1,13 @@
package com.ticketing.server.movie.domain.repository;
import com.ticketing.server.movie.domain.Theater;
+import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TheaterRepository extends JpaRepository {
+ Optional findByTheaterNumber(Integer theaterNumber);
+
}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java b/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java
new file mode 100644
index 0000000..864aada
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java
@@ -0,0 +1,5 @@
+package com.ticketing.server.movie.domain;
+
+public class MovieTest {
+
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java
new file mode 100644
index 0000000..df0ccb5
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java
@@ -0,0 +1,63 @@
+package com.ticketing.server.movie.domain.repository;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import com.ticketing.server.movie.domain.Movie;
+import java.util.Optional;
+import javax.transaction.Transactional;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.Rollback;
+
+@SpringBootTest
+@Transactional
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class MovieRepositoryTest {
+
+ @Autowired
+ MovieRepository movieRepository;
+
+ @Order(1)
+ @Test
+ @Rollback(value = false)
+ @DisplayName("Movie Repository - test saving movie")
+ void shouldAbleToSaveMovie() {
+ // given
+ Movie movie = new Movie("범죄도시 2", 106);
+
+ // when
+ Movie savedMovie = movieRepository.save(movie);
+
+ // then
+ assertEquals(movie.getTitle(), savedMovie.getTitle());
+ }
+
+ @Order(2)
+ @Test
+ @DisplayName("Movie Repository Test - finding movie with title")
+ void ShouldAbleToFindMovieWithTitle() {
+ // given, when
+ Optional optionalMovie = movieRepository.findByTitle("범죄도시 2");
+
+ // then
+ assertTrue(optionalMovie.isPresent());
+ }
+
+ @Order(3)
+ @Test
+ @DisplayName("Movie Repository Test - finding movie that doesn't exist")
+ void ShouldNotAbleToFindMovie() {
+ // given, when
+ Optional optionalMovie = movieRepository.findByTitle("존재하지 않는 영화");
+
+ // then
+ assertFalse(optionalMovie.isPresent());
+ }
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java
new file mode 100644
index 0000000..912ff57
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java
@@ -0,0 +1,5 @@
+package com.ticketing.server.movie.domain.repository;
+
+public class MovieTimesRepositoryTest {
+
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java
new file mode 100644
index 0000000..70ee9b6
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java
@@ -0,0 +1,5 @@
+package com.ticketing.server.movie.domain.repository;
+
+public class SeatRepositoryTest {
+
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java
new file mode 100644
index 0000000..38420d2
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java
@@ -0,0 +1,32 @@
+package com.ticketing.server.movie.domain.repository;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.ticketing.server.movie.domain.Theater;
+import javax.transaction.Transactional;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+@Transactional
+public class TheaterRepositoryTest {
+
+ @Autowired
+ TheaterRepository theaterRepository;
+
+ @Test
+ @DisplayName("Theater Repository Test - saving theater")
+ void ShouldAbleToSaveTheater() {
+ // given
+ Theater theater = new Theater(1, 100);
+
+ // when
+ Theater savedTheater = theaterRepository.save(theater);
+
+ // then
+ assertEquals(theater.getTheaterNumber(), savedTheater.getTheaterNumber());
+ }
+
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java
new file mode 100644
index 0000000..152aee6
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java
@@ -0,0 +1,5 @@
+package com.ticketing.server.movie.domain.repository;
+
+public class TicketRepositoryTest {
+
+}
diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java
new file mode 100644
index 0000000..f3d75e6
--- /dev/null
+++ b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java
@@ -0,0 +1,9 @@
+package com.ticketing.server.movie.service;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+public class MovieServiceImplTest {
+
+}