Skip to content

net79736/mybatis-mapper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

15 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MyBatis Mapper ํ”„๋กœ์ ํŠธ

Spring Boot์™€ MyBatis๋ฅผ ํ™œ์šฉํ•œ ์ฃผ๋ฌธ(Order) ๋ฐ ์ œํ’ˆ(Product) ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์ด ํ”„๋กœ์ ํŠธ๋Š” Spring Boot 3.2.5์™€ MyBatis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ๋ฌธ๊ณผ ์ œํ’ˆ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. 1:N ๊ด€๊ณ„(์ฃผ๋ฌธ:์ œํ’ˆ)๋ฅผ MyBatis์˜ collection ๋งคํ•‘์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋™์  SQL์„ ํ™œ์šฉํ•œ ์กฐ๊ฑด๋ถ€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

  • Java: 22
  • Spring Boot: 3.2.5
  • MyBatis: 3.0.3
  • Database: MySQL 5.1.45
  • ํ…œํ”Œ๋ฆฟ ์—”์ง„: Thymeleaf
  • ์ปค๋„ฅ์…˜ ํ’€: HikariCP
  • ๋นŒ๋“œ ๋„๊ตฌ: Maven
  • ํŒจํ‚ค์ง•: WAR
  • ๊ธฐํƒ€: Lombok, log4jdbc-log4j2

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ main/
โ”‚   โ”œโ”€โ”€ java/
โ”‚   โ”‚   โ””โ”€โ”€ org/wrapper/mybatismapper/
โ”‚   โ”‚       โ”œโ”€โ”€ configuration/
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ DatabaseConfiguration.java    # MyBatis ๋ฐ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •
โ”‚   โ”‚       โ”œโ”€โ”€ MybatisMapperApplication.java      # ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค
โ”‚   โ”‚       โ”œโ”€โ”€ order/
โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ mapper/
โ”‚   โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ OrderMapper.java          # MyBatis ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค
โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ service/
โ”‚   โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ OrderService.java         # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„œ๋น„์Šค
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ vo/
โ”‚   โ”‚       โ”‚       โ”œโ”€โ”€ OrderVO.java              # ์ฃผ๋ฌธ VO
โ”‚   โ”‚       โ”‚       โ”œโ”€โ”€ ProductVO.java            # ์ œํ’ˆ VO
โ”‚   โ”‚       โ”‚       โ””โ”€โ”€ SearchVO.java             # ๊ฒ€์ƒ‰ ์กฐ๊ฑด VO
โ”‚   โ”‚       โ””โ”€โ”€ ServletInitializer.java           # WAR ๋ฐฐํฌ์šฉ ์ดˆ๊ธฐํ™” ํด๋ž˜์Šค
โ”‚   โ””โ”€โ”€ resources/
โ”‚       โ”œโ”€โ”€ application.properties                 # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •
โ”‚       โ”œโ”€โ”€ mybatis/
โ”‚       โ”‚   โ”œโ”€โ”€ mapper/
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ OrderMap.xml                  # MyBatis ๋งคํผ XML
โ”‚       โ”‚   โ””โ”€โ”€ SQL(script)/
โ”‚       โ”‚       โ”œโ”€โ”€ common.sql                    # ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ
โ”‚       โ”‚       โ”œโ”€โ”€ createUser.sql                # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/์‚ฌ์šฉ์ž ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ
โ”‚       โ”‚       โ””โ”€โ”€ insert.sql                    # ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์Šคํฌ๋ฆฝํŠธ
โ”‚       โ””โ”€โ”€ templates/
โ”‚           โ””โ”€โ”€ index.html                        # ๊ธฐ๋ณธ ํŽ˜์ด์ง€
โ””โ”€โ”€ test/
    โ””โ”€โ”€ java/
        โ””โ”€โ”€ org/wrapper/mybatismapper/
            โ””โ”€โ”€ order/
                โ””โ”€โ”€ service/
                    โ””โ”€โ”€ OrderServiceTest.java     # ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

๐Ÿ—„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ

tb_order (์ฃผ๋ฌธ ํ…Œ์ด๋ธ”)

  • seq: ์ฃผ๋ฌธ ์ผ๋ จ๋ฒˆํ˜ธ (PK, AUTO_INCREMENT)
  • userId: ํšŒ์› ์•„์ด๋””
  • name: ํšŒ์› ์ด๋ฆ„
  • email: ํšŒ์› ์ด๋ฉ”์ผ
  • phone: ํšŒ์› ์ „ํ™”๋ฒˆํ˜ธ
  • address: ์ฃผ์†Œ
  • regDate: ์ƒ์„ฑ์ผ์‹œ
  • editDate: ์ˆ˜์ •์ผ์‹œ

tb_product (์ œํ’ˆ ํ…Œ์ด๋ธ”)

  • seq: ์ œํ’ˆ ์ผ๋ จ๋ฒˆํ˜ธ (PK)
  • order_seq: ์ฃผ๋ฌธ ์ผ๋ จ๋ฒˆํ˜ธ (FK)
  • name: ์ œํ’ˆ ์ด๋ฆ„
  • price: ๊ฐ€๊ฒฉ
  • regDate: ์ƒ์„ฑ์ผ์‹œ
  • editDate: ์ˆ˜์ •์ผ์‹œ

๊ด€๊ณ„: ํ•˜๋‚˜์˜ ์ฃผ๋ฌธ(tb_order)์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ œํ’ˆ(tb_product)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (1:N ๊ด€๊ณ„).

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Java 22 ์ด์ƒ
  • Maven 3.6 ์ด์ƒ
  • MySQL 5.7 ์ด์ƒ

์„ค์น˜ ๋ฐ ์‹คํ–‰

  1. ์ €์žฅ์†Œ ํด๋ก 

    git clone <repository-url>
    cd mybatis-mapper
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •

    MySQL์— ์ ‘์†ํ•˜์—ฌ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    -- createUser.sql ์‹คํ–‰
    CREATE DATABASE orders DEFAULT CHARACTER SET UTF8;
    CREATE USER 'TP'@'localhost' IDENTIFIED BY '1234';
    GRANT ALL PRIVILEGES ON orders.* TO 'TP'@'localhost';
    FLUSH PRIVILEGES;
  3. ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

    orders ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ํ›„:

    -- common.sql ์‹คํ–‰ (ํ…Œ์ด๋ธ” ์ƒ์„ฑ)
    -- insert.sql ์‹คํ–‰ (์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…)
  4. ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •

    application.properties ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/orders
    spring.datasource.hikari.username=TP
    spring.datasource.hikari.password=1234
    spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
  5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

    ./mvnw spring-boot:run

    ๋˜๋Š” Maven์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด:

    mvn spring-boot:run
  6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ‘์†

    ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080 ์ ‘์†

๐Ÿ”ง ์ฃผ์š” ๊ธฐ๋Šฅ

1. ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ (์กฐ๊ฑด๋ถ€ ๊ฒ€์ƒ‰)

OrderMapper.selectOrderList(SearchVO searchVO) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์œผ๋กœ ์ฃผ๋ฌธ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ์กฐ๊ฑด:

  • userId: ํšŒ์› ์•„์ด๋”” (LIKE ๊ฒ€์ƒ‰)
  • name: ํšŒ์› ์ด๋ฆ„ (LIKE ๊ฒ€์ƒ‰)
  • email: ํšŒ์› ์ด๋ฉ”์ผ (์ •ํ™•ํžˆ ์ผ์น˜)
  • address: ์ฃผ์†Œ (์ •ํ™•ํžˆ ์ผ์น˜)
  • productName: ์ œํ’ˆ ์ด๋ฆ„ (์ •ํ™•ํžˆ ์ผ์น˜)
  • price: ๊ฐ€๊ฒฉ ์ดํ•˜ (์ดํ•˜ ๊ฒ€์ƒ‰)

์˜ˆ์‹œ:

SearchVO searchVO = new SearchVO();
searchVO.setName("John");
searchVO.setPrice(90.0);
List<OrderVO> orders = orderService.selectOrderList(searchVO);

2. ์ฃผ๋ฌธ ์ผ๋ จ๋ฒˆํ˜ธ ๋ฆฌ์ŠคํŠธ๋กœ ์กฐํšŒ

OrderMapper.selectOrderListByOrderSeq(List<String> orderSeqList) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ฃผ๋ฌธ ์ผ๋ จ๋ฒˆํ˜ธ๋กœ ์ฃผ๋ฌธ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

List<String> orderSeqList = Arrays.asList("1", "2", "3");
List<OrderVO> orders = orderService.selectOrderListByOrderSeq(orderSeqList);

3. 1:N ๊ด€๊ณ„ ๋งคํ•‘

MyBatis์˜ <collection> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ๋ฌธ(OrderVO)๊ณผ ์ œํ’ˆ(ProductVO)์˜ 1:N ๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

<resultMap id="OrderListMap" type="org.wrapper.mybatismapper.order.vo.OrderVO">
    <id column="seq" property="seq" />
    <result column="user_id" property="userId" />
    <!-- ... -->
    <collection property="productObjList" ofType="org.wrapper.mybatismapper.order.vo.ProductVO">
        <id column="seq" property="seq" />
        <result column="order_seq" property="orderSeq" />
        <!-- ... -->
    </collection>
</resultMap>

๐Ÿงช ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” OrderServiceTest ํด๋ž˜์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์‹คํ–‰:

./mvnw test

์ฃผ์š” ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ:

  • selectOrderListWhereClause(): ์กฐ๊ฑด๋ถ€ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ (Deprecated)
  • selectOrderListByOrderSeq(): ์ฃผ๋ฌธ ์ผ๋ จ๋ฒˆํ˜ธ ๋ฆฌ์ŠคํŠธ๋กœ ์กฐํšŒ ํ…Œ์ŠคํŠธ

โš™๏ธ ์„ค์ • ์„ค๋ช…

DatabaseConfiguration

  • @MapperScan: org.wrapper.mybatismapper.**.mapper ํŒจํ‚ค์ง€์˜ ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋™ ์Šค์บ”
  • @EnableTransactionManagement: ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ํ™œ์„ฑํ™”
  • HikariCP: ๊ณ ์„ฑ๋Šฅ ์ปค๋„ฅ์…˜ ํ’€ ์‚ฌ์šฉ
  • SqlSessionFactory: MyBatis ์„ธ์…˜ ํŒฉํ† ๋ฆฌ ์„ค์ •
  • Mapper XML ์œ„์น˜: classpath:/mybatis/mapper/*.xml

MybatisMapperApplication

  • @PostConstruct: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ TimeZone์„ UTC๋กœ ์„ค์ •
  • WAR ํŒจํ‚ค์ง•์„ ์œ„ํ•œ ServletInitializer ํด๋ž˜์Šค ํฌํ•จ

๐Ÿ“ ์ฃผ์š” ํด๋ž˜์Šค ์„ค๋ช…

OrderVO

์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๋‹ด๋Š” Value Object์ž…๋‹ˆ๋‹ค. productObjList ํ•„๋“œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ฃผ๋ฌธ์— ์†ํ•œ ์ œํ’ˆ ๋ชฉ๋ก์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ProductVO

์ œํ’ˆ ์ •๋ณด๋ฅผ ๋‹ด๋Š” Value Object์ž…๋‹ˆ๋‹ค. orderSeq ํ•„๋“œ๋กœ ์ฃผ๋ฌธ๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

SearchVO

๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋‹ด๋Š” Value Object์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๋Š” ์„ ํƒ์ (Optional)์ด๋ฉฐ, ์„ค์ •๋œ ์กฐ๊ฑด๋งŒ WHERE ์ ˆ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

OrderService

์ฃผ๋ฌธ ๊ด€๋ จ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. OrderMapper๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ๋™์  SQL ํ™œ์šฉ

MyBatis์˜ ๋™์  SQL ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์กฐ๊ฑด๋ถ€ WHERE ์ ˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

<sql id="selectListOrderWhereClause">
    <if test="userId != null and userId != ''">
        AND tb_o.user_id LIKE CONCAT(#{userId}, '%')
    </if>
    <!-- ... ๊ธฐํƒ€ ์กฐ๊ฑด๋“ค ... -->
</sql>

๐Ÿ• ํƒ€์ž„์กด ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ

์ด ํ”„๋กœ์ ํŠธ์—๋Š” DB์™€ ์„œ๋ฒ„์˜ ์‹œ๊ฐ„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์„ ์‹ค์ œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • DATETIME vs TIMESTAMP์˜ ํƒ€์ž„์กด ์ฒ˜๋ฆฌ ์ฐจ์ด
  • LocalDateTime vs ZonedDateTime์˜ ๋™์ž‘ ์ฐจ์ด
  • JDBC URL์˜ serverTimezone ์„ค์ • ์˜ํ–ฅ
  • JVM ํƒ€์ž„์กด ์„ค์ • ์˜ํ–ฅ

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

ํƒ€์ž„์กด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

-- timezone_test.sql ์‹คํ–‰
source src/main/resources/mybatis/SQL(script)/timezone_test.sql

API ์—”๋“œํฌ์ธํŠธ

1. ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์กฐํšŒ

GET /api/timezone/test-data

์‘๋‹ต ์˜ˆ์‹œ:

{
  "jvmTimeZone": "Asia/Seoul",
  "dbTimeZoneInfo": {
    "global": "SYSTEM",
    "session": "SYSTEM",
    "system": "KST"
  },
  "data": [
    {
      "id": 1,
      "zoneDateTime": "2024-09-09T15:25:51+09:00[Asia/Seoul]",
      "localDateTime": "2024-09-09T15:25:51",
      "zoneTimestamp": "2024-09-09T15:25:51+09:00[Asia/Seoul]",
      "localTimestamp": "2024-09-09T15:25:51"
    }
  ]
}

2. ํŠน์ • ID ๋ฐ์ดํ„ฐ ์ƒ์„ธ ๋ถ„์„

GET /api/timezone/test-data/{id}

ํƒ€์ž„์กด ๋ณ€ํ™˜ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3. DB ํƒ€์ž„์กด ์ •๋ณด ์กฐํšŒ

GET /api/timezone/db-timezone

4. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

POST /api/timezone/test-data/kst  # KST ํ™˜๊ฒฝ์—์„œ ์ƒ์„ฑ
POST /api/timezone/test-data/utc  # UTC ํ™˜๊ฒฝ์—์„œ ์ƒ์„ฑ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‹คํ–‰

ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ•œ ์—ฌ๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

./mvnw test -Dtest=ZoneServiceTest

์ฃผ์š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค:

  1. ํ…Œ์ŠคํŠธ 1: ๊ธฐ๋ณธ ํ™˜๊ฒฝ(KST)์—์„œ ํƒ€์ž„์กด ๋™์ž‘ ํ™•์ธ

    • ์„œ๋ฒ„ JVM ํƒ€์ž„์กด: KST
    • JDBC URL ํƒ€์ž„์กด ์„ค์ •: ์—†์Œ
    • DB ํƒ€์ž„์กด: KST
  2. ํ…Œ์ŠคํŠธ 2: JDBC URL UTC ์„ค์ • ์‹œ ํƒ€์ž„์กด ๋™์ž‘ ํ™•์ธ

    • ์„œ๋ฒ„ JVM ํƒ€์ž„์กด: KST
    • JDBC URL ํƒ€์ž„์กด ์„ค์ •: UTC
    • DB ํƒ€์ž„์กด: KST
  3. ์ƒ์„ธ ๋ถ„์„: ํŠน์ • ID์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ธ ๋ถ„์„ํ•˜์—ฌ ํƒ€์ž„์กด ๋ณ€ํ™˜ ๋ฌธ์ œ ํ™•์ธ

  4. ํƒ€์ž„์กด ๋ณ€ํ™˜ ์ค‘๋ณต ๋ฌธ์ œ ์žฌํ˜„: ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์  ์žฌํ˜„

ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  1. application.yml ์„ค์ • ํ™•์ธ

    spring:
      datasource:
        hikari:
          jdbc-url: jdbc:log4jdbc:mysql://localhost:3307/orders?serverTimezone=UTC&characterEncoding=UTF-8
    • serverTimezone=UTC ์„ค์ • ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  2. ํ…Œ์ŠคํŠธ ์‹คํ–‰

    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฌธ์ œ ํ™•์ธ

    • ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์ ๋“ค์ด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ZonedDateTime์„ UTC๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ํŒŒ์ผ

  • src/main/java/org/wrapper/mybatismapper/timezone/vo/ZoneEntity.java
  • src/main/java/org/wrapper/mybatismapper/timezone/mapper/ZoneMapper.java
  • src/main/resources/mybatis/mapper/ZoneMap.xml
  • src/main/java/org/wrapper/mybatismapper/timezone/service/ZoneService.java
  • src/main/java/org/wrapper/mybatismapper/timezone/controller/ZoneController.java
  • src/test/java/org/wrapper/mybatismapper/timezone/service/ZoneServiceTest.java
  • src/main/resources/mybatis/SQL(script)/timezone_test.sql

๐Ÿ“Œ ์ฐธ๊ณ ์‚ฌํ•ญ

  • ์ด ํ”„๋กœ์ ํŠธ๋Š” WAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•๋˜์–ด ์™ธ๋ถ€ ํ†ฐ์บฃ ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SQL ๋กœ๊น…์„ ์œ„ํ•ด log4jdbc-log4j2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • TimeZone์€ UTC๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Lombok์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค.
  • ํƒ€์ž„์กด ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด DB์™€ ์„œ๋ฒ„์˜ ์‹œ๊ฐ„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ฐœ์ธ ํ•™์Šต ๋ฐ ๊ต์œก ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

About

initial-commit

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors