Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reservation #15

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/
15 changes: 15 additions & 0 deletions reservation/READEME.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Reservation




## error


* An attempt was made to access a socket in a way forbidden by its access permissions
- 도커 컨테이너가 실행되지 않는 에러
- `netsh interface ipv4 show excludedportrange protocol=tcp` 윈도우기준으로 확인해보면 사용할수없는 포트 목록이 나오는데 분명히 여기에 해당 컨테이너가 reserve 하려는 포트가 있을거임
- 해결법은 재부팅 (PC)

* UnknwonHostException
- docker-compose에서 따로 Hostname을 지정안해주면 지멋대로 hostname이 박아지는데 이거때문에 에러남 (컨테이너의 hosts 파일에 설정이 제대로 안되서 원인 발생)
10 changes: 8 additions & 2 deletions reservation/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,18 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.11'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.kafka:spring-kafka'
implementation 'org.springframework.boot:spring-boot-starter-logging:2.7.3'
implementation 'org.apache.httpcomponents:httpclient'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

// JUnit Test
testImplementation'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

// Set Environment
Expand All @@ -54,5 +60,5 @@ jar {
}

tasks.named('test') {
//useJUnitPlatform()
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.potaty.reservation.reservation;
package com.potato.reservation;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.potato.reservation.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = {"com.potato.reservation.module"},
entityManagerFactoryRef = "mysqlEntityManagerFactory",
transactionManagerRef = "mysqlTransactionManager"
)
public class DataSourceConfig {

@Bean
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(
@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
{
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
Properties jpaProperties = new Properties();

// DDL-AUTO 구문은 jpaProperties에서 아래와 같이 씀 jpaProperties.put("hibernate.ddl-auto", true);
jpaProperties.put("hibernate.hbm2ddl.auto", "update");
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");

entityManagerFactoryBean.setDataSource(mysqlDataSource);
entityManagerFactoryBean.setPackagesToScan("com.potato.pay.model.entity");

// 여기서 Jpa 구현체 설정가능 (기본값 : Hibernate)
JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactoryBean.setJpaProperties(jpaProperties);

return entityManagerFactoryBean;
}

@Bean
public PlatformTransactionManager mysqlTransactionManager(
@Qualifier("mysqlEntityManagerFactory") LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory
) {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(mysqlEntityManagerFactory.getObject());
return jpaTransactionManager;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.potato.reservation.config;

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

@Bean
@Qualifier("restTemplate")
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(5000); // 읽기시간초과, ms
factory.setConnectTimeout(3000); // 연결시간초과, ms
HttpClient httpClient = HttpClientBuilder.create()
.setMaxConnTotal(100) // connection pool 적용
.setMaxConnPerRoute(5)
.build();
factory.setHttpClient(httpClient); // HttpClient 세팅

return new RestTemplate(factory);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.potato.reservation.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

@Bean
public GroupedOpenApi testApi() {
return GroupedOpenApi.builder()
.group("v1-test")
.pathsToMatch("/test/**")
.build();
}

@Bean
public OpenAPI springOpenApi() {
return new OpenAPI()
.info(
new Info()
.title("Reservation Api")
.description("Reservation Desc")
.version("0.0.1")
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.potato.reservation.config.constant;

public class TransactionConstant {

public static final String MYSQL_TRANSACTION_MANAGER = "mysqlTransactionManager";

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.potato.reservation.constant;

public enum PayMethod {

KAKAO("KAKAO"),
TOSS("TOSS"),
;

private String method;
PayMethod(String method) {this.method = method;}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.potato.reservation.constant;

public enum PayStatus {
INIT("INIT"),
TRANSACTIONING("TRANSACTIONING"),
FAIL("FAIL"),
SUCCESS("SUCCESS"),
;

private String status;

PayStatus(String status) {this.status = status;}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.potato.reservation.model.entity;

import com.potato.reservation.constant.PayStatus;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.persistence.*;
import java.util.List;
import java.util.UUID;

@Entity(name = "ask")
@SuperBuilder
@Data
@RequiredArgsConstructor
public class Ask {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "pay_id")
private Long payId;
@Column(name = "basket_uuid")
private UUID basketUuid;
@Column(name = "pay_status")
private PayStatus payStatus;
@Column(name = "total_price")
private Long totalPrice;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.potato.reservation.model.entity;

import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.UUID;

@Entity(name = "basket")
@SuperBuilder
@Data
@RequiredArgsConstructor
public class Basket {

@EmbeddedId
private BasketUUID basketUuid;
@Column(name = "ask_id")
private Long askId;
@Column(name = "user_id")
private Long userId;

@Column(name = "product_id")
private Long productId;

@Column(name = "count")
private Integer count;


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.potato.reservation.model.entity;

import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable;
import java.util.UUID;
@Entity(name = "basket_uuid")
@Embeddable
@SuperBuilder
@Data
@RequiredArgsConstructor
public class BasketUUID implements Serializable {

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID uuid;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.potato.reservation.model.entity;

import com.potato.reservation.constant.PayMethod;
import com.potato.reservation.constant.PayStatus;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.persistence.*;

@Entity(name = "pay")
@SuperBuilder
@Data
@RequiredArgsConstructor
public class Pay {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "pay_mehtod")
private PayMethod payMethod;
@Column(name = "pay_status")
private PayStatus payStatus;
private Long amount;
@Column(name = "discount_amount")
private Long discountAmount;
@Column(name = "coupon_id")
private Long couponId;
@Column(name = "cash_receipt")
private String cashReceipt;
@Column(name = "point_ration")
private Float pointRation;

}
Loading