반응형

JPA 가 엔티티 데이터에 접근하는 방식을 지정한다.

1. AccessType.FIELD : 필드에 직접 접근한다.

@Access(AccessType.FIELD)
private String address1;

2. AccessType.PROPERTY : 프로퍼트로 접근한다. 

@Access(AccessType.PROPERTY)
public String getAddress2() {
	return address1 + address2;
}

3. AccessType 이 지정되지 않은 경우는 @Id 위치에 따라 지정된다.

@Entity
public class OrderInfo {
    @Id
    private Long id;
    private String address1;
    @Transient
    private String address2;

    @Access(AccessType.PROPERTY)
    public String getAddress2() {
        return address1 + address2;
    }

    public void setAddress2(String address2) {
        this.address2 = address2;
    }
}

- @Id 위치가 필드에 있기때문에 기본적으로 AccessType.FIELD 가 적용된다. AccessType.PROPERTY를 같이 적용하기 위해서는 메소드 위에 AccessType.PROPERTY 를 넣어주면 된다.

4. 기타 설명들

@Access is used to specify how JPA must access (get and set) mapped properties of the entity. If access type is set to FIELD, the values will directly be read/set on the field, bypassing getters and setters. If set to PROPERTY, the getters and setters are used to access the field value.

FIELD 로 정의하면 다이렉트로 field를 read/set 하고 PROPERTY로 설정하면 getter, setter 메소드를 통해서 접근한다.
https://stackoverflow.com/questions/19264871/what-is-the-use-of-the-access-annoation-in-jpa-means-at-the-entity-level

 

If you use field-based access, your JPA implementation uses reflection to read or write your entity attributes directly. It also expects that you place your mapping annotations on your entity attributes. If you use property-based access, you need to annotate the getter methods of your entity attributes with the required mapping annotations. Your JPA implementation then calls the getter and setter methods to access your entity attributes.

5 reasons why you should use field-based access
Better readability of your code
Omit getter or setter methods that shouldn’t be called by your application
Flexible implementation of getter and setter methods
No need to mark utility methods as *@Transient*
Avoid bugs when working with proxies

https://thorben-janssen.com/access-strategies-in-jpa-and-hibernate/

 

 

728x90
반응형
반응형

2021/02/17 - [Development/Java] - Spring Boot Test Case 작성에 대한 생각 - Service Test

2021/02/17 - [Development/Java] - Spring Boot Test Case 작성에 대한 생각 - Repository Test

Repository, Service 에 대한 테스트를 살펴봤으니 이제 Controller 테스트를 확인해보자. Controller Test 에는 @WebMvcTest 를 사용했다. Controller 는 확인해야 할 부분이 다음과 같다. 

1. request 를 요청한 url 과 파라메터가 정확한지 여부.
2. 정상 처리 되었을데 요구한 응답을 보내주는지.
3. 비정상일때에 response 에 상태 코드가 정확히 전달 되는지. 

@RunWith(SpringRunner.class)
@WebMvcTest(UserRestController.class)
public class UserRestControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;

    @Test
    public void getUsers() throws Exception {

        when(userService.findAll())
                .thenReturn(Arrays.asList(
                        Users.builder()
                                .email("test@test.com")
                                .name("test")
                                .status(UserStatus.APPLIED)
                                .build()
                ));

        this.mockMvc.perform(get("/users"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("@[0].email").value("test@test.com"));

    }
}

테스트케이스를 통해서 response 로 받는 내용과 상태 코드, 그리고 body 에 있는 내용들을 확인 해 볼 수 있다. 

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = [{"email":"test@test.com","name":"test","userStatus":"APPLIED"}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

그리고 print() 를 했기 때문에 콘솔 창에 위와 같은 결과도 같이 확인 해 볼 수 있다. 

그리고 잘못된 결과값이 나올 경우에도 response 가 잘 리턴 되는지 확인해 봐야 한다.

@Test
public void getUserNotFoundException() throws Exception {

  when(userService.findUserById("test11@test.com"))
    .thenThrow(
      new RuntimeException("User not found")
  );

  this.mockMvc.perform(get("/users/test11@test.com"))
    .andDo(print())
    .andExpect(status().isBadRequest());
}


위 테스트는 파라메터로 "test11@test.com" 을 보냈으나 사용자가 존재하지 않을때 400 error 와 메세지를 보내는 경우이다. 

MockHttpServletResponse:
           Status = 400
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"14"]
     Content type = text/plain;charset=UTF-8
             Body = User not found
    Forwarded URL = null
   Redirected URL = null

결과로 400 에러가 전달 되며 Body 에는 메세지가 써있다. 

Controller 테스트에서는 고려해야 할 것들이 많은것 같다. request 를 받고 response 를 보내야 하는 곳이기 때문에 파라메터에 대한 검증과 상태코드, response 값과 message 들이 잘 구성되어있어야 한다. Status 코드가 200이 떨어졌을때 보다는 200이 아닌경우의 상황을 더 많이 고려해야 되지 않을까 생각이 된다. 

주의사항) 제 생각을 기준으로 작성하고 만든 소스코드이고 의견이기 때문에 틀린 부분이 있을수 있습니다.

728x90
반응형
반응형

 

최근 들어 자바 버전이 굉장히 자주 업데이트 되고 있다. 그러다 보니 새로운 기능에 대해서 아는게 별로 없구나라는 생각을 자주 했었다. 마침 이렇게 새로운 버전에 대해서 리뷰할 기회가 되서 공부를 하게 되었다. 

 

우선 이 책은 총 21개의 챕터로 구성이 되어있고 600 페이지가 넘어가는 책이다. 앞에서 부터 차근차근 읽기에는 끈기와 노력이 필요하다. 그래서 나도 처음에는 차근차근 읽어가다가 어느정도 기본 개념에 대한 내용을 파악하고 난 후에는 실제로 내가 회사에서 사용해 볼 수 있는 부분부터 읽어 나가기 시작했다. . 

 

단, 최소한 5장까지는 차례대로 읽어보는 것을 권하고 싶다. 왜냐하면 5장까지의 내용을 알아야 뒤에 나오는 내용을 파악하는데 좀 수월해 진다. 5장의 내용이 위에 보듯이 스트림에 관련된 내용이다. 내 기준에서는 새로운 기능(?) 중에서 가장 쉽게 접하고 많이 써먹을 수 있는 기능이 아닐까 생각이 되었다. 그래서 5장까지 읽어 보라 한것이다. 

 

 

내가 읽으면서 가장 좋았던 내용이다. 스트림을 저렇게 설명한 그림은 처음 보는것 같다. 각각의 단계별로 그림을 통해서 내부적으로 어떻게 동작하는지 그리고 결과는 어떤 타입인지 설명을 해줘서 이해하기가 쉬웠다. 저렇게 각각의 리턴을 생각해보면서 써본적이 없었는데 이제야 제대로 알고 쓸수 있게 되었다. 

 

 

날짜 부분도 내가 관심있어 하는 부분이었다. 로컬타임, UTC, 타임존, 썸머타임 등등. 그런데 날짜 관련 해서는 사용 예 보다는 메서드 위주로 설명이 되어 있어서 약간 아쉬웠다. 아마도 최근에 날짜나 시간 관련해서 사용할 일들이 많아져서 개념과 함께 예들을 많이 보면 좋겠다라는 생각이 든것 같다. 

 

앞에서도 말했듯이 이 책은 도큐먼트 같은 성격의 책이다. 앞장부터 정주행하기 보다는 내가 먼저 사용해볼수 있는 부분에 대해서 찾아가면서 읽고 공부하는게 더 효율적인 책이다. 그리고 버전 8, 9, 10 에서 추가 된 내용들도 설명을 해주기 때문에 그동안 미뤄놨던 기능들을 마치 All in One 같이 알아볼 수 있다. 그래서 자바의 새로 추가된 기능들에 대해서 한번 정도 정리해보고 싶거나 하는 개발자들에게 많은 도움이 될것 같다. 

 

728x90
반응형
반응형

 

인사이트에서 진행하는 신간 리뷰어로 선정되어서 책을 읽게 되었다. 

 

C++ 이지만 이해할 수 있다.

 

대부분의 알고리즘 책들이 그렇듯이 이 책도 C++ 코드로 설명이 되어있다. 프로그래밍 경진대회에서 가장 높은 비율로 많이 사용되는 언어인데 효율적이며 표준 라이브러리에 많은 양의 자료 구조와 알고리즘이 포함되어 있기 때문이라고 한다. 나같은 경우는 java 만 주로 하고 C++ 은 대학때 이후로 안했지만 책을 이해하는데에는 어려움이 없었다. 우선 소스코드가 길지 않고 문법상 큰 차이가 없다. 그리고 코드에 대한 설명이 글과 그림을 통해서 자세히 설명이 되어있다. 오히려 다른 언어(나같은 경우는 java)를 사용해서 C++ 로 구현된 코드를 변경해 보면서 공부를 하면 더 도움이 된다. 

 

프로그래밍 기법에 대한 설명

 

알고리즘 문제를 풀기 위해서는 문제에 대한 이해도 필요하지만 이해한 내용을 코드로 옮기는 능력도 필요하다. 연필로 종이에 써가면서 문제 푸는 방법은 알았는데 이걸 코드로 옮기지 못하면 못푼거나 마찬가지 이다. 이때에 필요한 것들이 프로그래밍 기법이다. 자주 나오는 몇가지 들이 있는데 알고 있으면 정말 많은 도움이 된다. 그중에 하나로 나도 전에 알고리즘 시험볼때 자주 썼던 건데 바로 나머지 연산이다. 

 

전에 나머지 연산을 위와 같은 방법으로 사용할 때에는 그냥 모르고 사용을 했다. 그냥 공식을 외운거였다. 그런데 고맙게도 이 책에서 설명을 해준 덕분에 이해를 할 수 있었다. 이런 기법들은 있는지도 모를 뿐더러 찾기도 어렵다. 하지만 모르는 순간 다푼 문제가 시간초과를 겪거나 자릿수가 너무 많아져서 에러가 나는 경험을 하게 된다. 그래서 이책에서 알려주는 몇가지 기법들은 문제를 푸는데 꿀팁처럼 도움이 된다. 

 

문제에 대한 자세한 설명

 

나는 문제풀때 가장 어려웠던 분야가 동적계획법(DP:Dynamic Programming)이었다. 점화식을 구하면 50줄도 안되는 코드만 써도 문제가 풀리지만 그걸 도출해내지 못하면 그냥 포기해야 했다. 그런데 고맙게도 이 책에서 이렇게 자세히 설명을 해주면서 알려주고 있다. 어떤 책들은 그냥 말로만 설명해주고 끝나는 경우가 있는데 이 책에서는 그림과 공식을 설명해 주고 어떻게 도출되는지 과정도 설명을 해주고 있다.

 

그리고 다른 챕터들도 마찬가지 이지만 처음에는 트리, 동적계획법, 정수, 행렬등 기본적인 개념을 설명을 해주기 때문에 문제의 유형에 대해서도 파악을 할 수 있다. 

 

수학에 대한 작은 부록

 

책 마지막 부분에는 이렇게 수학공식과 기본적인 내용이 담겨져 있다. 페이지 수는 그렇게 많지는 않다. 하지만 내가 생각하기에는 그 내용이 고등학교 정석책 기준으로 상당한 분량을 차지할거라 생각이 된다. 가끔 문제를 풀다 보면 분명 중,고등학교 때에 배운건데 기억이 나지않을때가 있다. 그 공식만 알면 풀릴것 같은 문제인데 도저히 생각이 안날때가 있다. 이 부록을 통해서 조금이나마 그런 내용들을 기억 속에서 되살리는데 도움이 될거라 생각된다. 

 

 

결론

내가 이 책을 읽으면서 들었던 느낌은 "어! 이 책 제법 재미있네!" 였다. 읽으면서도 왠지 노트를 꺼내서 연필로 코드를 짜봐야 할것 같고 맞는지 틀린지 실행을 해봐야 할것 같은 느낌이 들었다. 위에서도 말했듯이 실제로 C++ 로 설명된 코드를 Java 로 옮겨보면서 책을 읽어가고 있다. 길지않는 챕터에 핵심과 요점들이 가득 담겨 있어서 나는 정말 만족하면서 읽고 있다. 물론 이건 사람마다 차이가 있을 수는 있다. 하지만 분명한건 어느 정도 코드를 작성할 수 있고 이해할 수 있는 사람이 알고리즘 책을 추천해 달라고 한다면 이 책을 추천해주고 싶다. 

 

728x90
반응형
반응형


한빛 미디어의 "나는 리뷰어다" 를 통해서 Think Data Structures (자바로 배우는 핵심 자료구조와 알고리즘) 책을 받게되었다. 전에 한빛 미디어 사이트를 들어갔을때 어떤 책인지 궁금했었는데 이렇게 타이밍 적절하게 책을 읽게 되었다. 


우선 이책은 그냥 알고리즘 책이 아니다. "자바로 배우는" 알고리즘 책이다. 그렇기 때문에 자바 코드를 읽을 수 있어야 한다. 저자도 책의 머릿말에 사전 준비사항으로 자바를 언급하면서 익숙하지않은 독자들은 "Think Java", "Head First Java" 책을 권해주고 있다. 


자바의 Collection 과 알고리즘


이 책에는 Java Collection들이 많이 나온다. LinkedList, Map, ArrayList 등등. 알고리즘을 설명하면서 거기에 맞는 클래스를 구현한다. 구현을 하다 보면 우리가 Java 에서 사용하는 Collection 클래스가 만들어진다. 그래서 그저 import만 해서 노출된 메서드만 사용하는것을 넘어서 그 클래스가 어떻게 동작하는지 이해할 수 있게 된다. 그리고 각각의 실습을 통해서 실제로 적용해볼 수 있도록 유도한다. 



알고리즘과 적용


알고리즘에 대한 설명과 더불어 위키피디아 웹 클롤러나 인덱서를 실제로 구현해 볼수도 있다. 책에서는 간단하게 구현하고 설명하고 있지만 그 작동 원리를 이해하는데 많은 도움이 된다. 어떤 알고리즘을 적용해야 하는지 어떻게 구현해야 하는지 생각하고 실습하다 보면 더 이 책의 재미에 더 빠져들 수 있다. 



이책이 나에게 다른 알고리즘 책에 비해서 좀더 친숙하다고 생각한 것은 Java 로 된 소스코드 때문이다. C 나 파이썬이 아닌 Java 로 되어있었기 때문에 나에게는 더 유익했고 이해가 쉬웠다. Java 개발자라면 한번쯤 읽어보고 내가 그동안 썼던 라이브러리들에 대해서 다시 생각해 볼 수 있는 계기를 마련해줄수 있는 책이다. 


728x90
반응형
반응형

Spring Security 를 적용하는 내용을 처음부터 차근차근 정리를 해보려고 한다. 

목표는 Spring Security 를 공부하면서 각각의 기능들을 적용해보는것이다. 진행하다보면 Spring Security 뿐만 아니라 다른 내용들도 점점 추가될것 같다. 다 만들고 나서는 git에 소스를 공유할 생각이다. ^^;; 언제가 될지는 잘 모르겠다.


환경 : java 1.8, Spring Boot 1.5.3 Release, Maria DB, JPA, gradle


build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
 
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
 
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
 
repositories {
    jcenter()
    mavenCentral()
}
 
 
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-security')
 
    testCompile('org.springframework.boot:spring-boot-starter-test')
 
    runtime ('org.mariadb.jdbc:mariadb-java-client')
}
cs



아직 초반이어서 라이브러리가 몇개 없다. spring-boot 에서 사용하는 jpa, security, test, web 라이브러리가 끝이다. 그리고 DB를 사용하기 위한 mariadb client까지만 추가되어있다.


도메인.

Account.java

1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
public class Account {
    @Id
    private String loingId;
 
    private String username;
 
    private String password;
 
    private String email;
 
    private boolean enabled;
}
cs


Account 도메인이 있다. 만들기는 더 여러개 만들어놓았는데 우선은 이것만 필요해서 적었다. 위 Account.java 소스에는 getter/setter 메소드는 삭제하고 올렸다. (너무 길어서)


다음은 Account 관련 Service와 Repository 이다. 


AccountRepository.java

1
2
public interface AccountRepository extends JpaRepository<Account, String> {
}
cs


AccountService.java

1
2
3
4
public interface AccountService {
    Account get(String loginId);
}
 
cs


AccountServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
@Service
public class AccountServiceImpl implements AccountService {
 
    @Autowired
    private AccountRepository accountRepository;
 
    @Override
    public Account get(String loginId) {
        return accountRepository.findOne(loginId);
    }
}
cs


Repository를 다이렉트로 호출해도 되긴 하지만 아무래도 구조상 service 레이어가 있는게 맞다고 판단해서 repository는 Service 에서 호출하도록 한번 감쌌다. 지금은 간단히 호출만 하지만 나중에는 로직도 들어갈것이 예상된다.


CustomUserDetailService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class CustomUserDetailService implements UserDetailsService{
 
    @Autowired
    private AccountService accountService;
 
    @Override
    public UserDetails loadUserByUsername(String loginId) throws UsernameNotFoundException {
 
        Account account = accountService.get(loginId);
 
        List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
 
        User user = new User(account.getLoingId(), account.getPassword(), grantedAuthorities);
 
        return user;
    }
}
cs


UserDetailsService에 있는 loadUserByUsername 메소드를 제정의 해서 UserDetails 객체를 정의해준다. UserDetails는 사용자의 인증정보를 담고있다. 위에서 Account Service에서 loginId로 정보를 조회해서 가져온 id, password, 권한(아직 미구현으로 객체만 생성했다) 정보를 user로 생성해주고 있다.




ResourceSecurityConfiguration.java

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@EnableGlobalAuthentication
public class ResourceSecurityConfiguration extends WebSecurityConfigurerAdapter {
 
    @Autowired
    private CustomUserDetailService customUserDetailService;
 
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(this.customUserDetailService);
    }
}
 
cs


WebSecurityConfigurerAdapter에 있는 init 메소드를 사용해서 AuthenticationManangerBuilder에 userDetailService를 내가 새로 만든 CustomUserDetailService를 사용하겠다고 설정해준다.


StudySpringApplication.java

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
public class StudySpringApplication {
 
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(StudySpringApplication.class);
 
        app.run(args);
    }
}
 
cs


application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
  port: 9000
 
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/holmes
    username: root
    validation-query: select 1
    test-while-idle: true
    time-between-eviction-runs-millis: 300000
    test-on-borrow: false
 
  jpa:
    database: mysql
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQLDialect
        default_schema: holmes
cs


이제 어플리케이션을 실행해보면 로그인 페이지가 나온다. 





위에 소스와 약간 차이가 있을수 있지만 아래 Git repository 에 가면 소스를 확인할 수 있다. 


https://github.com/blusky10/study_spring


728x90
반응형
반응형

쓰다보면 별 생각없이 사용했던 Date 클래스.

심지어 util.Date 인지 sql.Date인지도 생각도 안하고 썼는데.. (있는지도 잘 몰랐네 -_-)

그런데 이런 차이점이 있었다..


일단 sql 패키지의 Date 클래스는 java.util.Date 클래스를 상속 받는다. 

그런데.. 문제는 이게 값을 가져올때이다.

오버라이딩한 toString을 찾아보면 


  1. public String toString () {
  2.         int year = super.getYear() + 1900;
  3.         int month = super.getMonth() + 1;
  4.         int day = super.getDate();
  5.         char buf[] = "2000-00-00".toCharArray();
  6.         buf[0] = Character.forDigit(year/1000,10);
  7.         buf[1] = Character.forDigit((year/100)%10,10);
  8.         buf[2] = Character.forDigit((year/10)%10,10);
  9.         buf[3] = Character.forDigit(year%10,10);
  10.         buf[5] = Character.forDigit(month/10,10);
  11.         buf[6] = Character.forDigit(month%10,10);
  12.         buf[8] = Character.forDigit(day/10,10);
  13.         buf[9] = Character.forDigit(day%10,10);
  14.         return new String(buf);
  15.     }


보면. 시/분/초 에 대한 내용이 없다. -_-;

따라서 시/분/초까지 정보를 가져오기 위해서는 java.sql.Date가 아닌 java.util.Date를 사용해야한다.


728x90
반응형
반응형

가끔 DB에 입력할 값하고 기존에 있던 값하고 비교해야 할 상황이 생긴다.

그럴때마다 객체에 있는 수많은 getter 메소드를 소스 코드에 써줘야 한다면 코드가 참 지저분할것 같다.

그래서 사용한 방법이 Reflection 이다.

Class에 있는 정보를 읽어와서 실제로 메소드까지 실행 가능하니.. 라인수를 확 줄일 수 있다. ^^

  1. import java.lang.reflect.Method;
  2. public class ReflectionTest {
  3.     public static void main(String[] args) throws Exception {
  4.         // DB에 입력하려는 DATA
  5.         TestVO test = new TestVO();
  6.         test.setId("test");
  7.         test.setName("kim");
  8.         test.setAddr("seoul");
  9.         test.setHobby("game");
  10.        
  11.         printModifyValue(test);
  12.     }
  13.  
  14.     private static void printModifyValue(TestVO test) throws Exception{
  15.         // 값을 비교할 객체에 있는 METHOD를 가져옴
  16.         Method method[] = test.getClass().getDeclaredMethods();
  17.        
  18.         // DB에 현재 존재하는 DATA(DB 연결시에는 DB에서 DATA를 가져오면 됨)
  19.         TestVO testFromDB = new TestVO();
  20.         testFromDB.setId("testDB");
  21.         testFromDB.setName("kim");
  22.         testFromDB.setAddr("Pusan");
  23.         testFromDB.setHobby("music");
  24.        
  25.         // reflection을 이용한 get method  실행
  26.                 for (int i=0; i < method.length; i++){
  27.             String methodName = method[i].getName();
  28.             if (methodName.indexOf("get") != -1){
  29.                 Object inputValue = method[i].invoke(test, null);
  30.                 Object dbValue = method[i].invoke(testFromDB, null);
  31.                
  32.                 // inputValue 가 null, "" 일경우
  33.                 // dbValue 가 null 인데 inputValue 가 "" 인 경우
  34.                 // dbValue 가 "" 안데 inputValue 가 null 인 경우
  35.                 // inputValue 와 dbValue 가 같을 경우
  36.                 if (inputValue == null || "".equals(inputValue) ||
  37.                     dbValue == null && "".equals(inputValue) ||
  38.                     "".equals(dbValue) && inputValue == null ||
  39.                     dbValue.equals(inputValue)){
  40.                     continue;
  41.                 }else if (!dbValue.equals(inputValue)){
  42.                     // 한쪽만 NULL 이거나 값이 서로 같지 않으면 컬럼 값이 변경된 것으로 인식
  43.                     System.out.println("dbValue = " + dbValue + "/ inputValue = " + inputValue);
  44.                 }
  45.             }
  46.         }
  47.     }
  48. }

결과

dbValue = Pusan/ inputValue = seoul 
dbValue = music/ inputValue = game 
dbValue = testDB/ inputValue = test



728x90
반응형

'Development > Java' 카테고리의 다른 글

util.Date vs sql.Date 차이  (0) 2014.07.01
JSP 용량초과? 65535 bytes limit  (0) 2013.11.21
Integer.paserInt 를 사용한 진법 변환  (0) 2013.11.12
Null Object 사용  (0) 2013.07.05
Singleton Pattern  (0) 2013.07.03
반응형

Integer.parseInt를 많이 써왔었지만 문자를 정수로 바꾼다라는 것 밖에 몰랐었다.

그런데 이 함수가 다른 기능도 있었다. 

바로 진법 변환.

  1. @Test
  2. public void integerTest(){
  3.     String number1 = "1010";
  4.     String number2 = "10";   
  5.     Assert.assertEquals(10Integer.parseInt(number1, 2));
  6.     Assert.assertEquals(8Integer.parseInt(number2, 8));
  7. }

위 테스트 코드를 실행하면 정상적으로 실행이 된다.

첫번째는 1010을 2진법 수로 인식해서 결과값을 10을 리턴했고

두번째는 10을 8진법 수로 인식해서 결과값을 8로 리턴했다.

진법 변환하는것을 코드로 짜면 귀찮았는데 Integer.paserInt 함수에 이런 기능이 있었다니. ^^ 참 편리하네


728x90
반응형

'Development > Java' 카테고리의 다른 글

JSP 용량초과? 65535 bytes limit  (0) 2013.11.21
Reflection 활용한 값 비교  (0) 2013.11.13
Null Object 사용  (0) 2013.07.05
Singleton Pattern  (0) 2013.07.03
List 를 Array로 바꾸는 함수.  (0) 2013.07.02

+ Recent posts