[SpringBoot/Vue.js Project] Blog Implementation - Spring Boot
Backend Setting
application.properties
server.port = 1111
spring.datasource.driver-class-name=oracle.jdbc.pool.OracleDataSource
spring.datasource.url=YOUR_ORALCE_WALLET_TNSNAME_AND_DIRECTORY
spring.datasource.username=YOUR_ID
spring.datasource.password=YOUR_PASSWORD
oracle.ucp.minPoolSize=5
oracle.ucp.maxPoolSize=50
spring.main.allow-bean-definition-overriding=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
logging.level.com.example.demo=debugConfig Package
MongoConfig Class
: Embedded Database Setting (Mongo DB)
@Profile(value = "mongo")
@Configuration
@Import(EmbeddedMongoAutoConfiguration.class)
public class MongoConfig {
}OracleConfig Class
: External Database Setting (Oracle ATP DB)
@Profile(value = "oracle")
@Configuration
public class OracleConfig {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${oracle.ucp.minPoolSize}")
private String minPoolSize;
@Value("${oracle.ucp.maxPoolSize}")
private String maxPoolSize;
@Value("${spring.datasource.driver-class-name:oracle.jdbc.pool.OracleDataSource}")
private String driverClassName;
@Bean(name = "OracleUniversalConnectionPool")
@Primary
public DataSource getDataSource() {
PoolDataSource pds = null;
try {
pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName(driverClassName);
pds.setURL(url);
pds.setUser(username);
pds.setPassword(password);
pds.setMinPoolSize(Integer.valueOf(minPoolSize));
pds.setInitialPoolSize(10);
pds.setMaxPoolSize(Integer.valueOf(maxPoolSize));
} catch (SQLException ea) {
System.err.println("Error connecting to the database: " + ea.getMessage());
}
return pds;
}
}WebConfig Class
: Fronted Connection Setting
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
String exampleAddress = "http://127.0.0.1:9999"; //This is an test address.(Maybe your frontend address.)
registry.addMapping("/**")
.allowedOrigins(exampleAddress);
}
}ApiResponse Package
ApiResponse Abstract
@Getter @Setter
@RequiredArgsConstructor
public abstract class ApiResponse<T> {
@NonNull private T data;
private List<String> errors;
}Main API Packages
Item Class
: Model of the API, mostly from Oracle ATP Database. (Below is the partial of ArticleItem Class.)
@Entity
@Data
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name="Article")
public class ArticleItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private String id;
@Column(name="Title")
private String title;
@Column(name="Contents")
private String contents;
@Column(name="Created_at")
@CreationTimestamp
private LocalDateTime created_at;
@Column(name="Modified_at")
@UpdateTimestamp
private LocalDateTime modified_at;
@Column(name = "Menu_id")
private String menu_id;
}Adapter Class
: Based in the @Builder of the Item Class, Adapter Class build the Response and Item(Model).
public class ArticleItemAdapter {
public static ArticleItemResponse articleItemResponse(final ArticleItem articleItem, final List<String> errors) {
return ArticleItemResponse.builder()
.articleItem(articleItem)
.errors(Optional.ofNullable(errors).orElse(new ArrayList<>()))
.build();
}
public static ArticleItem articleItem(final ArticleItemRequest articleItemRequest) {
if(articleItemRequest == null) {
return null;
}
return ArticleItem.builder()
.title(articleItemRequest.getTitle())
.contents(articleItemRequest.getContents())
.created_at(articleItemRequest.getCreated_at())
.modified_at(articleItemRequest.getModified_at())
.menu_id(articleItemRequest.getMenu_id())
.build();
}
}Repository Class
: Below is the Repository from Oracle ATP Database.
@Repository
public interface ArticleItemRepository extends JpaRepository<ArticleItem, String>{
}Controller Class
: URL Resolution for get, getAll, create, delete and update.
@RestController
@RequestMapping("/article")
public class ArticleItemController {
@Autowired
private ArticleItemService articleItemService;
@RequestMapping(method = RequestMethod.GET, value = "/{id}")
public @ResponseBody
ArticleItemResponse get(@PathVariable(value = "id") String id) {
List<String> errors = new ArrayList<>();
ArticleItem articleItem = null;
try {
articleItem = articleItemService.get(id);
} catch (final Exception e) {
errors.add(e.getMessage());
}
return ArticleItemAdapter.articleItemResponse(articleItem, errors);
}
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<ArticleItemResponse> getAll() {
List<String> errors = new ArrayList<>();
List<ArticleItem> articleItems = articleItemService.getAll();
List<ArticleItemResponse> articleItemResponse = new ArrayList<>();
articleItems.stream().forEach(articleItem -> {
articleItemResponse.add(ArticleItemAdapter.articleItemResponse(articleItem, errors));
});
return articleItemResponse;
}
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody
ArticleItemResponse create(@RequestBody final ArticleItemRequest articleItemRequest) {
List<String> errors = new ArrayList<>();
ArticleItem articleItem = ArticleItemAdapter.articleItem(articleItemRequest);
try {
articleItem = articleItemService.create(articleItem);
} catch (final Exception e) {
errors.add(e.getMessage());
}
return ArticleItemAdapter.articleItemResponse(articleItem, errors);
}
@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
public @ResponseBody void delete(@PathVariable(value = "id") String id) {
List<String> errors = new ArrayList<>();
try {
articleItemService.delete(id);
} catch (final Exception e) {
errors.add(e.getMessage());
}
}
@RequestMapping(method = RequestMethod.PUT, value = "/{id}")
public @ResponseBody ArticleItemResponse update(@PathVariable(value = "id") String id, @RequestBody final ArticleItemRequest articleItemRequest) {
List<String> errors = new ArrayList<>();
ArticleItem articleItem = ArticleItemAdapter.articleItem(articleItemRequest);
try {
articleItem = articleItemService.update(id, articleItem);
} catch (final Exception e) {
errors.add(e.getMessage());
}
return ArticleItemAdapter.articleItemResponse(articleItem, errors);
}
}Service Class
: get, getAll, create, delete and update methods using Repository.
@Service
public class ArticleItemService {
@Autowired
private ArticleItemRepository articleItemRepository;
public ArticleItem get(final String id) { return articleItemRepository.findById(id).orElse(null); }
public List<ArticleItem> getAll() {
return articleItemRepository.findAll();
}
public void delete(final String id) { articleItemRepository.deleteById(id); }
public ArticleItem create(final ArticleItem articleItem) {
if(articleItem == null) {
throw new NullPointerException("Menu Item cannot be null!");
}
return articleItemRepository.save(articleItem);
}
public ArticleItem update(final String id, final ArticleItem articleItem) {
if(!articleItemRepository.existsById(id)) {
throw new NullPointerException("Article Item ID is NULL.");
}
ArticleItem existArticleItem = articleItemRepository.findById(id).orElse(null);
existArticleItem.setTitle(articleItem.getTitle());
existArticleItem.setContents(articleItem.getContents());
existArticleItem.setMenu_id(articleItem.getMenu_id());
existArticleItem = articleItemRepository.save(existArticleItem);
return existArticleItem;
}
}Response Class
: This class extends the ApiResponse Abtract from ApiResponse package.
public class ArticleItemResponse extends ApiResponse<ArticleItem> {
@Builder
public ArticleItemResponse(final ArticleItem articleItem, final List<String> errors) {
super(articleItem);
this.setErrors(errors);
}
}Request Class
@Setter @Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ArticleItemRequest {
private String id;
private String title;
private String contents;
private LocalDateTime created_at;
private LocalDateTime modified_at;
private String menu_id;
}
Comments