백엔드 개발자의 기본: 데이터를 잘 저장하고 잘 가져오는 것



@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:~/spring-jpa;DATABASE_TO_UPPER=false;"
+ "INIT=RUNSCRIPT FROM 'classpath:/script/schema.sql'");
dataSource.setUsername("sa");
dataSource.setPassword("");
dataSource.setInitialSize(10);
dataSource.setMaxTotal(10);
dataSource.setMinIdle(10);
dataSource.setMaxIdle(10);
dataSource.setMaxWaitMillis(1000);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(true);
dataSource.setTestWhileIdle(true);
// dataSource.setValidationQuery("select 1");
return dataSource;
}
일반적으로 위 4개의 값을 통일하는 것을 추천한다.
public enum TemporalType {
DATE,
TIME,
TIMESTAMP
}
cf.) java 8 date/time (LocalTime, LocalDate, ZonedDateTime) 타입은 @Temporal을 붙이지 않는다.
추상화는 덜 되어 있지만 get 한 번에 가져올 수 있다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@Entity
@Table(name = "OrderItems")
@IdClass(OrderItem.PrimaryKey.class)
public class OrderItem {
@Id
@Column(name = "order_id")
private Long orderId;
@Id
@Column(name = "line_number")
private Integer lineNumber;
@Column(name = "item_id")
private Long itemId;
@Column
private int quantity;
@AllArgsConstructor
@NoArgsConstructor
@Getter@Setter
@EqualsAndHashCode
public static class PrimaryKey implements Serializable {
private Long orderId;
private Integer lineNumber;
}
}
추상화가 잘 되어 있지만, 가져올때 getPk().get~을 해야한다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@Entity
@Table(name = "OrderItems")
public class OrderItem2 {
@EmbeddedId
private PrimaryKey pk;
@Column(name = "item_id")
private Long itemId;
@Column
private int quantity;
@AllArgsConstructor
@NoArgsConstructor
@Getter@Setter
@EqualsAndHashCode
public static class PrimaryKey implements Serializable {
@Column(name = "order_id")
private Long orderId;
@Column(name = "line_number")
private Integer lineNumber;
}
}