본문 바로가기
반응형

개발/JAVA31

[Mybatis] 쿼리를 어떻게 실행하는 것일까? Mybatis는 Mapper 또는 xml을 이용하여 쿼리를 작성해놓고 코드로 실행 시키기만 하면 알맞는 쿼리를 실행하도록 한다. 이번에는 어떠한 원리로 xml로 작성한 쿼리가 실행되는지 알아보도록 하겠다. Mapper 등록 원리는 아래에서 볼 수 있습니다. csy7792.tistory.com/301 [Mybatis] Mapper는 어떻게 등록되는 것일까 ? Mybatis를 처음 접하게되면 xml 또는 JAVA로 설정만 해주면 어디서든 가져다쓸 수 있다는것이 마법같이 느껴질 수 있다. 어떠한 원리로 그렇게 사용할 수 있는지 알아보도록 하겠다. MybatisConfiguration. csy7792.tistory.com 바로 시작하겠습니다 1. SqlSession.query 아래 메소드를 실행하게 된다면 현재.. 2020. 12. 28.
[Mybatis] Parameter not found. Available parameters are [arg0, param1] Parameter not found. Available parameters are [arg0, param1] Mybatis를 xml이 아닌 Mapper 어노테이션은 이용할 때 다음과 같은 오류가 발생할 수 있다. 오류가 발생하는 구문 해당오류는 파라미터의 개수가 2개이상일때 발생한다. 해결방안은 총 4가지가 있다. @Param 어노테이션 사용 파라미터명, 바인딩될 변수명을 arg0, arg1, ....... 으로 맞춰주기 파라미터명, 바인딩될 변수명을 param1, param2, ..... 으로 맞춰주기 Compile Option에 -parameters 추가 1. @Param 어노테이션 사용 2. 변수명을 arg으로 맞추기 3. 변수명을 param으로 맞추기 2020. 12. 27.
[Mybatis] Mapper는 어떻게 등록되는 것일까 ? Mybatis를 처음 접하게되면 xml 또는 JAVA로 설정만 해주면 어디서든 가져다쓸 수 있다는것이 마법같이 느껴질 수 있다. 어떠한 원리로 그렇게 사용할 수 있는지 알아보도록 하겠다. MybatisConfiguration.xml 파일 .... SqlMapClient.java public class SqlMapClient { private static SqlSessionFactory sqlMapper; static { try { String resource = "config/myBatisConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(rea.. 2020. 12. 27.
[Mybatis] Interface를 이용하여 Query 날리기 Mybatis는 xml으로 Query를 실행할 수도있지만 Interface를 선언하고 Method에 어노테이션을 붙임으로써 Query를 날릴 수 있다. 간단하게 방법을 알아보도록 하겠다. Interface를 하나 생성하고 Method를 만든다. 간단한 예제이기때문에 @Select 어노테이션을 이용하여 쿼리를 작성한다. MybatisConfiguration.xml Config 파일에 매퍼의 패키지를 등록한다. 등록된 Mapper를 가져와서 만들어놓은 Method를 실행한다. 끝! 2020. 12. 27.
[Mybatis] Application Server의 Connection Pool 이용하기 회사에서 기존 Persistence Framework는 아래와 같은 문제점이 존재하였다. 어떠한 쿼리가 현재 작성되어 있는지 관리가 전혀 되지않음 파라미터 바인딩이 어려움 Dynamic Query를 작성하기 어려움 Dynamic Query를 작성하려면 비즈니스로직에 작성해야함 -> 유지보수가 힘들어짐 그렇기에 팀장님께 Persistence Framework 교체를 건의했으며 후보는 아래와 같았다. hibernate Mybatis hibernate로 이관을 하려면 러닝커브가 존재했으므로 보류되었고 비교적 바로적용할 수 있는 Mybatis가 채택되었다. 현재 회사의 설정에는 Application Server의 Connection Pool을 Applictaion이 당겨다가 쓰는방식으로 되어있었다. 그렇기에 M.. 2020. 12. 26.
[Mybatis] interceptor 를 등록하면 어떠한 원리로 동작하는가 ? ..... Mybatis를 사용하다가 Interceptor를 이용할일이 생겼다. Interceptor를 등록을하고 사용을 하는데는 문제가 없었지만 어떠한 원리로 동작을 저렇게 할 수 있는지 궁금해졌다. 그래서 Mybatis를 뜯어보기로 결심했다. (Mybatis Source : github.com/mybatis/mybatis-3) 순서 1. SqlSessionFactoryBuilder.build 2. XMLConfigBuilder.parse 3. XMLConfigBuilder.parseConfiguration 4. XMLConfigBuilder.pluginElement 5. DefaultSqlSessionFactory.openSessionFromDataSource 6. Configuration.newEx.. 2020. 12. 25.
[JAVA] 함수의 결과를 성공과 실패만 판단하면 될때 반환값으로 어떤값이 좋을까? 함수의 결과를 성공과 실패만 판단하면 될때 어떤형식이 좋을까 ? 함수를 실행할때 반환값을 지정해줄 수 있다. void로 지정하면 반환값이 없어도된다. 함수를 실행만 하고 반환값이 필요없다면 void가 옳은선택일까? 그렇다면 함수를 실행하다가 실패한다면 예외를 던질것인가 ? 나쁘지 않은 선택이다. 하지만 void에는 2가지 단점이있다. 1. 테스트코드를 작성하기 힘들다. 2. 어떠한 이유때문에 예외가 발생됐는지 명확하게 알기 힘들다. 불리언으로 성공일때는 true 실패일 때는 false로 표현하는 간단한 방법도 있다. 어떤 동작이 성공/실패로 나뉘어지면 실패이유가 단1가지 뿐이라면 불리언도 좋은 선택이 될 수 있다. 하지만 대부분의 로직은 실패이유가 1개보다 많다. 이럴때 어떠한 이유때문에 예외가 발생됐는.. 2020. 9. 15.
[JAVA] Stream을 이용하여 Map 안에 있는 값 간편하게 출력하기 우리는 JAVA8 이전에 Map안에 있는값을 모두 출력하려면 조금 까다로웠다. JAVA8에 Stream이 추가되면서 간편하게 모든값을 출력할 수 있게되었다. public class main { public static void main(String[] args) { Map favouriteMovies = ofEntries( entry("1", "1") , entry("2", "2") , entry("3", "3") ); // 상황에 맞게 사용 favouriteMovies.forEach((k,v)-> System.out.println("key: "+k+" value: " +v)); favouriteMovies.entrySet().stream() .forEach(entry-> System.out.printl.. 2020. 8. 23.
[JAVA 8] Stream을 활용하여 합계를 구하는 여러가지 방법 예제에 사용할 Class는 2가지가 있다. Dish Class 와 main Class Dish.class package streamexam; public class Dish { private String name; private int calories; public Dish(String name, int calories) { this.name = name; this.calories = calories; } public String getName() { return name; } public int getCalories() { return calories; } } main.class import streamexam.Dish; import java.util.ArrayList; import java.util... 2020. 8. 21.
[enum] enum의 활용방법 JAVA를 처음 배울때 enum 부분을 보면서 이걸 어디다 써? 쓸데도 없어보이는데 왜 배우는거지? 라는 의문이 들것이다. (나는 들었다...) 실제로 취업을 하고나서 팀장님께서 사용하시기 전까지만해도 쓸모가 없는줄 알았다. 하지만 enum은 상태값을 관리할때 매우 강력하다. 말로만 쓴다면 모르니 예제를 통해 알아보도록 하자. USER의 정보를 가지는 테이블이 있다. USER라는 테이블은 아래와 같이 USER의 권한을 가지는 컬럼이 있다. 우리는 "1"은 유저 "2"는 유저라고 정하고 그 규칙을 맞춰서 코딩을 했다. public class Account { private String Role; public Account(String role) { Role = role; } } public final cl.. 2020. 7. 11.
[effective java 3/E] 제네릭 <로 타입은 사용하지 말라> 제네릭을 사용할 때 로 타입(raw type)은 절대 사용하면 안된다. 왜 사용하면 안되는지 알아보기 전에 로 타입이 무엇인지 모르시는분들을 위해 용어 설명을 먼저 하겠다. 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스 or 제네릭 인터페이스라고 한다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 매개변수화 타입을 정의한다. ex) List 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 예를든다면 List를 정의하면 List가 함께 정의되는데 List가 List의 로 타입이다. 로 타입이 무엇인지 알아보았으니 이제 왜 사용하면 안되는지를 알아 보겠다. 오류는 가능한 한 컴파일 시점에 발견해야 한다. "로 .. 2020. 7. 11.
[effective java 3/E] 추상 클래스보다는 인터페이스를 우선하라. 이번 글을 읽기 위해서는 추상클래스와 인터페이스의 차이점을 알아야한다. 자바8 버전이전에 가장 큰 차이점은 추상 클래스는 구현부가 있는 메소드를 가질 수 있지만 인터페이스는 가질 수 없다는점이 제일 컸다. 자바8 버전에서 디폴트 메소드가 추가되면서 인터페이스도 구현부를 가질 수 있게 되었다. 그렇다면 우리는 여기서 세가지 의문을 가질 수 있다. 인터페이스와 추상클래스는 똑같지 않나요? 인터페이스와 추상클래스 어떤것이 더 좋은건가요? 인터페이스와 추상클래스 어떻게 사용하나요? 인터페이스와 추상클래스는 똑같지 않나요? 여전히 다릅니다. 자바는 다중상속이 안되기에 추상클래스를 사용하면 다른 상속을 받지 못합니다. 인터페이스를 사용한다면 여러개를 구현할 수 있습니다. 인터페이스는 변수는 public static.. 2020. 7. 8.