코딩하는 털보

Spring Framework - 1 본문

IT Study/Spring Framework

Spring Framework - 1

이정인 2020. 12. 18. 18:56

maven / logback

  • maven

build를 담당하는 maven & gradle
mvc compile을 통해 필요한 library들을 검토하고 자동으로 다운로드 해준다.
다운받은 jar파일들은 User Home 디렉토리의 .m2/repository에 보관된다.
설정 파일
maven : pom.xml
gradle : build.gradle
컴파일하면 target으로 실행가능하도록 생성됨

  • logback (slf4j)

level이 내려갈수록 log 범위가 작아짐
logging을 담당하는 logback
.trace
.debug
.info
.warn
.error

logback에 대한 설정은 src/main/resources에 logback.xml(spring-boot에서는 logback-spring.xml)을 생성하여 할 수 있다.
ex) logback.xml

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="trace">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
  • DB(h2)

설치

brew install h2

실행 (브라우저에서 h2-console로 연결된다)

h2

JDBC API는 java.sql과 javax.sql이 있는데 각각 JAVA SE와 EE에 호환된다.

연결, 테이블생성, 조회

public class Main {
    private static Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        logger.info("Hello World");

        //Connection, Statement, ResultSet은 java.sql에 있는 구현체이다.
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("org.h2.Driver");
            String url = "jdbc:h2:mem:test;MODE=MySQL;";
            connection = DriverManager.getConnection(url, "sa", "");
            statement = connection.createStatement();

            connection.setAutoCommit(false);

            //테이블 생성
            statement.execute("create table member(" +
                    "id int auto_increment, " +
                    "username varchar(255) not null, " +
                    "password varchar(255) not null, " +
                    "primary key(id))");

            //데이터 insert
            statement.executeUpdate("insert into member(username, password)" +
                    "values('jilee','1234')");

            ResultSet resultSet = statement.executeQuery("select * from member");

            //select 결과는 ResultSet에 저장되며
            //ResultSet.next()는 커서를 레코드 단위로 리턴한 뒤 마지막에는 false를 리턴한다. 
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");

                logger.info(id + username + password);
            }

            connection.commit();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            try {
                connection.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        //사용한 자원 정리 단계
        } finally { 
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException throwables) {
                    throwables.printStackTrace();
            }
        }
    }
}

리팩토링 후
var 사용 / try with resource 사용 / Member 모델 사용

public class Main {
    private static Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) throws ClassNotFoundException {
        logger.info("Hello World");

        Class.forName("org.h2.Driver");
        var url = "jdbc:h2:mem:test;MODE=MySQL;";

        try(var connection = DriverManager.getConnection(url, "sa", "");
            var statement = connection.createStatement();)
        {
            connection.setAutoCommit(false);
            statement.execute("create table member(" +
                    "id int auto_increment, " +
                    "username varchar(255) not null, " +
                    "password varchar(255) not null, " +
                    "primary key(id))");

            try {
                statement.executeUpdate("insert into member(username, password)" +
                        "values('jilee','1234')");
                connection.commit();
            } catch (SQLException e) {
                connection.rollback();
            }

            var resultSet = statement.executeQuery("select * from member");
            while (resultSet.next()) {
                var member = new Member(resultSet);
                logger.info(member.toString());
            }

        } catch (SQLException e) {
        }
    }
}
  • Lombok

코드의 가독성을 위하여 사용한다.

@Getter
@Setter
@ToString
@NoArgsConstructor
@RequiredArgsConstructor
public class Member {

    private int id;
    @NonNull private String userName;
    @NonNull private String password;

    public Member(ResultSet resultSet) {
        try {
            this.id = resultSet.getInt("id");
            this.userName = resultSet.getString("username");
            this.password = resultSet.getString("password");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
  • servlet

EE 버전의 스팩을 구현한 servlet 서버로는 tomcat / jeus / oracle weblogic 등이 있다.

EE 사용을 위한 의존성 추가

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

WAR 설정 추가

    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
Comments