Java 개발자가 Grails에게 기회를 주어야 하는 이유는 무엇입니까?
게시 됨: 2022-03-11Java는 수년간의 개발을 통해 성숙해진 생태계를 가지고 있으며 가장 안정적인 플랫폼 중 하나로 자리 잡았습니다. 그러나 특히 웹 애플리케이션과 같은 작업을 신속하게 완료하는 데 필요한 수단이 부족합니다. 이러한 유형의 문제로 인한 좌절을 피하기 위해 개발자는 Ruby on Rails가 포함된 Ruby, Django가 포함된 Python 등과 같은 최신 웹 프레임워크와 구현 언어를 대신 선택하는 경우가 많습니다. Java와 달리 이들은 웹 애플리케이션을 구축하기 위한 훨씬 더 간소화된 경로를 제공합니다.
다행히 웹 애플리케이션을 구축하려는 Java 개발자에게는 더 나은 방법 이 있으며 여기에는 Grails가 포함됩니다. 이 기사에서는 Grails with Groovy가 JVM 영역에서 실행 가능한 대안이 되는 방법을 살펴보겠습니다. 우리는 Grails가 Java 개발자로서 우리에게 매력적이며 다른 사람에게도 기회를 제공하도록 유혹할 수 있는 몇 가지 예를 살펴볼 것입니다.
이야기
내가 일했던 스타트업에서 우리는 바로 이 문제가 있었습니다. 작업하기 힘든 Spring 애플리케이션이 있었습니다. 점점 더 커지면서 리팩토링과 기능 추가가 생각보다 오래 걸린다는 것을 곧 알게 되었습니다. 이를 다른 동기와 결합하여 핵심 애플리케이션을 다시 작성하기로 결정했습니다. 우리는 또한 기존 기술 스택을 변경하거나 교체하는 데 개방적이었습니다. Grails는 JVM에서 실행되고 우리가 이미 알고 있는 기술 위에 구축되었기 때문에 실행 가능한 선택처럼 보였습니다. Groovy 프로그래밍 언어를 사용하지만 동시에 Java와 혼합할 수 있습니다. 그래서 우리는 뛰어들었습니다.
전속력 전방
Grails가 정말 탁월한 것 중 하나는 새 프로젝트를 쉽게 시작할 수 있도록 하는 것입니다. 나중에 추가할 클래스에 필요한 모든 폴더로 프로젝트 구조를 생성하는 명령을 실행하는 것만큼 간단합니다. 모델 클래스, 컨트롤러, 서비스 및 웹 페이지를 추가하는 데도 마찬가지로 최소한의 노력이 필요합니다. 당신이 돌봐야 할 유일한 것은 물건의 이름을 지정하고 올바르게 배치하는 것입니다. Java와 달리 필요하기 때문에 있어야 하는 상용구 코드가 거의 없습니다. 이것은 Grails의 두 축인 Spring과 Hibernate를 사용함으로써 부분적으로 가능하게 되었으며, coding byconvention의 개념도 가지고 있다. 프로젝트를 실행하기 위해 Grails는 개발 서버로 Apache Tomcat과 함께 번들로 제공됩니다. IDE에서 프로젝트를 실행하기만 하면 코드가 배포된 상태에서 서버가 실행됩니다. 또한 Hibernate를 사용한 Grails의 GORM(Object Relational Mapping)이 데이터베이스 생성을 처리합니다. 기존 데이터베이스를 사용하려면 JDBC 연결 속성을 구성하거나 메모리 내 인스턴스를 사용하도록 기본적으로 그대로 두어야 합니다. Grails가 있는 서버가 실행되면(Spring MVC 애플리케이션보다 약간 더 소요됨) 코드를 수정할 수 있으며 핫 배포 기능은 디버그 세션에 최신 버전을 계속 유지합니다. 이 방법으로 다시 로드할 수 없는 유일한 클래스는 엔터티 클래스입니다.
데이터베이스 채우기는 SQL 스크립트를 사용하여 수행할 수 있지만 지루할 수 있습니다. 모든 Grails 프로젝트에는 애플리케이션이 실행될 때 실행될 Bootstrap 클래스가 포함되어 있습니다. 이 클래스에서 데이터를 저장하거나 수정하여 애플리케이션 상태를 초기화할 수 있습니다. 이것은 우리에게 매우 유용한 것으로 판명되었으므로 개발 버전에 몇 가지 테스트 사례가 즉시 있습니다.
데이터 조작
Grails에서 즉시 우리의 관심을 끈 것 중 하나는 데이터 작업의 용이성이었습니다. 데이터베이스에서 읽는 것은 반복해서 수행해야 하는 작업입니다. 그리고 여러 번 그것은 간단합니다. 특정 기준을 충족하는 하나 이상의 엔터티를 가져온 다음 집계하는 것과 같습니다. 다이나믹 파인더를 사용하지 않는 이유는 무엇입니까? 메소드가 런타임에 동적으로 생성되는 데이터를 쿼리하는 방법입니다. 명명 규칙을 따르기만 하면 됩니다.
def users = User.findAllByLastNameLikeOrAgeGreaterThan('Doe%', 30)위 줄은 성이 "Doe"로 시작하거나 나이가 30보다 큰 모든 사용자 개체를 가져옵니다. 예, 매우 복잡한 경우는 아니지만 요점은 알 수 있습니다.
"failedLogins" 속성이 10보다 큰 목록에 대해 이 목록을 추가로 필터링하려면 어떻게 해야 할까요? 생성된 날짜를 기준으로 정렬하려면 어떻게 해야 할까요? 그리고 그들의 이름을 연결하거나 반환된 사용자의 최대 연령을 찾으려면 어떻게 해야 할까요?
users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(', ') def maximumAge = users.age.max()위의 예는 단순해 보이지만 데이터 쿼리, 필터링 및 조작에 Grails가 얼마나 강력한지 보여줍니다. Java 8에서는 이러한 경우에 대해 유사한 결과를 얻을 수 있지만 여전히 Grails보다 더 많은 코드가 필요합니다.
가끔은 다르게 만들고 싶어
동적 생성자 또는 명명된 인수 생성자는 우리 중 많은 사람들이 Java에 갖고 싶어하는 기능입니다. 특정 클래스에서 허용하는 생성자를 정의하는 것은 좋지만 많은 경우에 일부 속성을 설정하고 darn 인스턴스를 가져오고 싶을 뿐입니다. Groovy는 기본적으로 지도의 우아함을 입력으로 취하고 지도 항목으로 속성을 설정하는 각 엔터티에 대한 특수 생성자를 추가합니다.
def Person = new Person(name: 'Batman', age: 57)이 접근 방식은 훨씬 더 표현력이 뛰어나고 모든 생성자 상용구 코드가 필요하지 않은 코드로 이어집니다.
그리고 다음은 Groovy 지도의 훌륭함과 우아함을 보여주는 몇 가지 예입니다.
def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map['bread'] = 4 map.milk = 6이것은 코드가 어떻게 짧고 간단하면서도 강력할 수 있는지에 대한 또 다른 예입니다. 인라인 초기화를 사용하는 방법과 객체 속성과 유사한 방식으로 맵 값을 조작하는 방법을 보여줍니다. 정말로 원하지 않는 한 기본 조작을 위해 기존 Java 메소드를 호출할 필요가 없습니다.
더 많은 힘이 필요합니다!
물론 모든 것을 할 수 있는 프레임워크는 없지만, 부족한 부분을 채울 때 자체 솔루션을 구현하기 전에 이미 사용할 수 있는 다른 것이 무엇인지 확인해야 합니다. Grails 기반 기능을 확장하기 위해 Grails 플러그인을 사용할 수 있습니다. 플러그인 설치는 모든 Grails 프로젝트에 있는 BuildConfig 클래스에 다른 줄을 추가하면 간단히 완료됩니다(코드 규칙이 다시 적용됩니다!).

compile ':spring-security-core:2.0-RC4'위의 라인은 애플리케이션에 Spring 보안 코어를 추가하고 이 기능을 통합하는 데 필요한 구성은 사실상 더 이상 없습니다.
즉, 우리가 처리해야 했던 사건에 대해 말씀드리겠습니다. 여러 데이터 엔터티에 걸쳐 검색을 구현해야 했습니다. Grails에는 사용하기 쉬운 Elasticsearch 플러그인이 있습니다. 이전에 언급했듯이 구성 파일에서 플러그인을 참조하기만 하면 됩니다. 특정 클래스의 엔터티를 검색하려면 해당 클래스에 정적 "검색 가능한" 속성을 추가하기만 하면 됩니다. 원하는 경우 검색이 허용되는 속성을 제한할 수도 있습니다.
class User { static searchable = { only = name } String name Double salary }아주 작은 코드지만 내부적으로 Grails와 Elasticsearch 플러그인은 자동으로 모든 사용자를 이름으로 인덱싱하고 이름으로 검색할 수 있도록 합니다. 실제 검색 호출도 매우 간결합니다.
User.search("${params.query}")원하지 않으면 Lucene 인덱스를 건드릴 필요가 없습니다. 모든 것이 우리를 위해 자동으로 수행됩니다. 플러그인에는 검색 결과를 표시하는 API도 있습니다. 검색된 텍스트에서 찾은 일치 항목을 강조 표시할 수 있습니다. 이것은 플러그인이 우리가 직접 구현할 필요를 피함으로써 훨씬 더 효율적으로 만들 수 있는 거대한 기능 번들을 제공할 수 있는 방법의 한 예일 뿐입니다.
우리는 여전히 더 많은 힘이 필요합니다
플러그인은 훌륭하지만 때로는 전체 플러그인이 필요하지 않고 추가 기능이 필요합니다. 기존 Java 클래스에 추가 메소드를 갖고 싶었지만 확장/재정의하고 싶지 않은(또는 할 수 없는) 마지막 시간을 기억하십니까? Groovy에서는 기존 클래스 또는 특정 인스턴스에만 메서드와 속성을 추가할 수 있습니다. 예를 들어, 날짜 형식을 일관되게 지정하고 정적 유틸리티 클래스를 작성하거나 다양한 필터를 정의하고 싶지 않을 때 멋진 formatting 방법을 java.util.Date 클래스에 추가할 수 있습니다.
Date.metaClass.formatDate = { delegate.format("dd.MM.yyyy") }계산된 값으로 사용자 목록을 정렬하고 한 가지 경우에만 필요한 경우(예: User 클래스에 새 메서드를 추가하면 오염될 수 있음) 어떻게 될까요? 각 인스턴스에 속성을 추가한 다음 해당 속성을 기준으로 컬렉션을 정렬하거나 필터링할 수 있습니다.
user.metaClass.computedProp = 312 * 32 * 3Groovy 작성자는 이미 일부 핵심 Java 클래스에 많은 개선 사항을 추가했으므로 우리는 그럴 필요가 없습니다. 다음은 몇 가지 예입니다.
"빼기"를 사용하여 다른 컬렉션에 있는 컬렉션의 모든 요소를 제거합니다.
assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5] 날짜에서 날짜를 더하거나 빼거나 Calendar 으로 변환하거나 추가 라이브러리를 사용하지 않고 날짜의 특정 필드를 가져오거나 설정하는 것과 같이 여러 번 편리하게 사용되는 java.util.Date 개체를 조작하기 위한 추가 방법.
def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0) 날짜 조작에 대해 실제로 설명하고 싶다면 Groovy에 추가된 TimeCategory 클래스를 사용하면 됩니다.
use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }망치와 못
그런 다음 IDE가 있습니다. Eclipse 기반 GGTS 및 IntelliJ IDEA는 Grails와 함께 작동하도록 설정되었습니다. 그들은 프로젝트 구조를 이해하고(폴더와 리소스를 탐색하는 데 도움이 될 것입니다) 가장 자주 사용하는 명령(예: 컨트롤러 추가, 페이지 추가, 프로젝트 실행 등)에 대한 바로 가기를 가지고 있습니다. Grails를 사용하면 (프로젝트를 실행하거나 새로운 플러그인 기능을 설정하기 위해) 명령을 실행하고 IDE에서도 다루는 다른 구성이 필요합니다. 코드 완성은 컨트롤러와 작업을 자주 참조하는 Grails 웹 템플릿 페이지에서 잘 작동합니다. Netbeans, TextMate, Emacs 등과 같이 Grails와 함께 사용할 수 있는 다른 IDE도 있습니다.
다크 사이드는 어떻습니까?
인생의 모든 것과 마찬가지로 Grails에도 주의 사항이 있습니다. 종종 좋은 일이 될 수 있는 많은 마술이 내부에서 행해지고 있지만 때로는 결과가 예상한 것과 다를 수 있습니다. 타이핑을 사용하지 않고(예, Groovy에서 유형은 선택 사항임) 충분히 주의하지 않았기 때문에 버그가 발생합니다. 그리고 너무 늦을 때까지 오류를 눈치채지 못할 수도 있습니다. 또한 동료에게 깊은 인상을 주기 위해 한 줄짜리 글을 쓰는 것은 매우 유혹적입니다. 그리고 당신 자신. 그러나 이러한 강력한 코드 라인은 동료들에게 자명하지 않을 수 있습니다. 또는 몇 달 안에 자신에게조차도. 이것이 내가 Grails가 보다 전통적인 프레임워크보다 더 많은 프로그래밍 원칙을 요구하는 이유라고 생각합니다.
시간은 돈이다
현재 프레임워크에서 요구한다고 해서 코딩에 더 많은 시간이 소요되어서는 안 됩니다. 특히, 최근 스타트업의 수가 증가함에 따라 실제로 중요한 작업에 집중하고 가능한 한 효율적으로 작업하는 것이 중요합니다. 시간은 실제로 돈이며 시장 출시 시간이 중요합니다. 시간이 다 되어 경쟁자가 앞서기 전에 신속하게 조치를 취하고 솔루션을 구현할 수 있어야 합니다.
Ruby on Rails 또는 Python/Django로 작업하는 제 친구들은 이러한 기술이 얼마나 멋진지 저에게 오랫동안 말해왔습니다. 그리고 데이터베이스에 무언가를 저장하고 웹 페이지에 표시하는 코드를 작성하는 데 Java로 얼마나 더 많은 시간이 걸렸는지 생각하는 것은 정말 어리석은 일이었습니다. Grails는 실제로 유용한 답변일 수 있습니다. 순수 자바, Spring MVC, Hibernate로 이것을 할 수 없다는 것은 아니다. 당신은 할 수 있습니다. 애플리케이션이 조금 더 빠르게 실행될 수도 있습니다. 그러나 Grails를 사용하면 작업을 더 빨리 완료할 수 있습니다.
